Практическая разница между правилами парсера и правилами лексера в ANTLR?

Я понимаю теорию разделения теоретических правил и правил лексера в теории, но каковы практические различия между этими двумя утверждениями в ANTLR:

my_rule: ... ;

MY_RULE: ... ;

Они приводят к различным деревьям AST? Различная производительность? Потенциальные неясности?

2 ответа

Решение

Джен написала:

... каковы практические различия между этими двумя утверждениями в ANTLR ...

MY_RULE будет использоваться для токенизации вашего входного источника. Он представляет собой фундаментальный строительный блок вашего языка.

my_rule вызывается из синтаксического анализатора, он состоит из нуля или более других правил синтаксического анализатора или токенов, созданных лексером.

В этом разница.

Джен написала:

Они приводят к различным деревьям AST? Различная производительность? ...

Парсер строит AST, используя токены, созданные лексером, поэтому вопросы не имеют смысла (для меня). Лексер просто "подает" парсеру одномерный поток токенов.

Этот пост может быть полезен:

Лексер отвечает за первый шаг, и его единственной задачей является создание "потока токенов" из текста. Он не несет ответственности за понимание семантики вашего языка, его интересует только понимание синтаксиса вашего языка.

Например, синтаксис - это правило, согласно которому в идентификаторе должны использоваться только символы, цифры и символы подчеркивания, если он не начинается с цифры. Ответственность лексера - понять это правило. В этом случае лексер примет последовательность символов "asd_123", но отклонит символы "12dsadsa" (при условии, что не существует другого правила, в котором этот текст действителен). При просмотре действительного текстового примера он может выдать токен в поток токенов, такой как IDENTIFIER(asd_123).

Обратите внимание, что я сказал "идентификатор", который является общим термином для таких вещей, как имена переменных, имена функций, имена пространств имен и т. Д. Парсер будет тем, что будет понимать контекст, в котором появляется этот идентификатор, так что он затем будет дополнительно определять этот знак как имя определенной вещи.

(sidenote: токен - это просто уникальное имя, данное элементу потока токенов. Лексема - это текст, с которым был сопоставлен токен. Я пишу лексему в скобках рядом с токеном. Например, NUMBER(123). В данном случае это токен NUMBER с лексемой '123'. Однако с некоторыми токенами, такими как операторы, я опускаю лексему, поскольку он избыточен. Например, я бы написал SEMICOLON для токена точки с запятой, а не SEMICOLON(;)).

ОТ ANTLR - КОГДА ИСПОЛЬЗОВАТЬ ПРАВИЛА PARSER ПРОТИВ ЛЕКСЕРНЫХ ПРАВИЛ?

Другие вопросы по тегам