Практическая разница между правилами парсера и правилами лексера в ANTLR? - PullRequest
18 голосов
/ 28 ноября 2010

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

my_rule: ... ;

MY_RULE: ... ;

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

Ответы [ 2 ]

25 голосов
/ 28 ноября 2010

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

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

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

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

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

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

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

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

3 голосов
/ 03 ноября 2018

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

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

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

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

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

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

...