Получить информацию о номере столбца нескольких идентификаторов в одной строке в antlr4 python target - PullRequest
0 голосов
/ 24 марта 2020

Я пишу парсер в python с antlr4.

Короче говоря, строка ввода:

concept foo bar

Правило грамматики, которое разбирает над строкой ввода:

start_rule: 'concept' identifier
identifier: ID {ID}

Чтобы получить номер столбца и номер строки всех идентификаторов в строке ввода, я добавляю код в функцию enteridentifier (self, ctx).

enteridentifier(self, ctx):
    context = ctx.start
    line_number = context.line
    column_number = conext.column

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

1 Ответ

1 голос
/ 24 марта 2020

На enter у вас не будет готового для анализа всего (под) дерева разбора. Вместо этого используйте вариант exit или (еще лучше) выполнить этап после анализа (часто называемый фазой semanti c), чтобы извлечь информацию такого рода.

Как только у вас будет полное (под) дерево Вы можете получить доступ к члену ID в контексте identifier, который является массивом, если может появиться более одного вхождения указанного правила или токена c. Повторите это, чтобы получить отдельные дочерние элементы.

Чтобы получить информацию о столбце для ID, используйте тот факт, что для лексерных токенов вызов getChild() возвращает экземпляр TerminalNode (вы должны привести результат к этому). Оттуда вызовите getSymbol(), который даст вам экземпляр Token, который, в свою очередь, содержит всю информацию для указанного c токена, такого как текст, канал, столбец, строка, тип et c.

...