ANTLR4 синтаксический анализ имени переменной, содержащей ключевое слово - PullRequest
0 голосов
/ 09 марта 2020

Я пытаюсь разобрать простое целочисленное объявление в antlr4.
Грамматика, которую я сейчас делаю:

main  : 'int' var '=' NUMBER+ ;
var   : LETTER (LETTER | NUMBER)* ;
LETTER: [a-zA-Z_] ;
NUMBER: [0-9] ;
WS    : [ \t\r\n]+ -> skip ;

Когда я пытался проверить основное правило с помощью int int_A = 0, Я получил ошибку:

посторонний ввод 'int', ожидающий LETTER.

Я знаю, это потому, что имя переменной 'int_A' содержит ключевое слово 'int', но как изменить мою грамматику? Спасибо.

1 Ответ

0 голосов
/ 09 марта 2020

Лексер создает токены с максимально возможным количеством символов. Поэтому int_A токенизируется как следующие 3 токена:

  • 'int' (ключевое слово int определено в синтаксическом анализаторе)
  • LETTER (_)
  • LETTER (A)

Таким образом, парсер не может создать var с этими токенами.

Вместо правила парсера var, сделайте его Правило лексера:

main   : 'int' VAR '=' NUMBER+ ;
VAR    : [a-zA-Z_] ([a-zA-Z_] | [0-9])* ;
NUMBER : [0-9]+ ;
WS     : [ \t\r\n]+ -> skip ;
...