ссылка на то, где находится анализатор при вызове слушателя правила в ANTLR4 - PullRequest
0 голосов
/ 14 января 2019

Я генерирую слушателей на Python, но любой язык подходит для ответов или комментариев.

Мне нужно знать, есть ли какая-то ссылка на то, где в дереве синтаксического анализа, или даже лучше, в потоке токенов или в исходном файле синтаксический анализатор имеет значение при вызове определенного метода прослушивателя.
Я получил объект контекста, который имеет ссылку на сам синтаксический анализатор, я искал его, но, похоже, ничего не нашел.
Это только для отладки.

def enterData_stmt(self, ctx:fassParser.Data_stmtContext):

Я знаю, что синтаксический анализатор просматривает не исходный файл, а скорее абстрактное синтаксическое дерево, и я мог бы взглянуть на него и узнать, где находится синтаксический анализатор, но мне интересно, смогу ли я получить небольшой контекст для быстрой отладки без необходимости обхода дерева

1 Ответ

0 голосов
/ 14 января 2019

Каждый объект ParseRuleContext имеет поля start и stop, которые содержат первый и последний токены, соответствующие правилу соответственно. Объекты токена имеют методы getLine и getCharPositionInLine для определения номера строки и номера столбца, где начинается каждый токен соответственно (нет методов, сообщающих, где заканчивается токен (кроме как в виде абсолютного индекса - не строка и столбец) число), поэтому, если вам это нужно, вам нужно рассчитать его самостоятельно, используя начальную позицию и длину).

Я знаю, что pareser просматривает не исходный файл, а скорее абстрактное синтаксическое дерево

Конечно, анализатор обходит исходный файл - как еще он может его проанализировать? Парсер проходит через исходный файл для генерации (не очень абстрактного) дерева разбора. Если вы используете посетителя или ParseTreeWalker со слушателем, тогда посетитель / слушатель будет обходить сгенерированное дерево разбора. Если вы используете addParseListener, слушатель будет вызываться с частично построенным деревом, пока синтаксический анализатор все еще анализирует файл.

...