Правила синтаксического анализатора ANTLR со строковыми литералами


Скажем, если мои правила синтаксического анализатора выглядят следующим образом:

rule1 : 'functionA' '(' expression-inside-parenthesis ')'; 
expression-inside-parenthesis: ....;
Но я никогда не определял никакого правила лексера для 'functionA', '('и')'. Будут ли они рассматриваться парсером как маркеры? Для ' ('и ')', есть только 1 символ в любом случае, и я полагаю, что не будет никакой разницы. Но для "функции", если я никогда не определял ее как маркер в моих правилах лексера, как парсер мог видеть ее как маркер?
1 2

1 ответ:

Джаваман написал::

Как синтаксический анализатор может рассматривать его как маркер?

ANTLR создает маркер для вас за кулисами.

Правило:

rule1 : 'functionA' '(' expression-inside-parenthesis ')';
// parser rules ...
// lexer rules  ...

Эквивалентно:

rule1 : FA '(' expression-inside-parenthesis ')';
// parser rules ...
FA : 'functionA';
// lexer rules  ...

В случае лексем, которые состоят только из 1 символа и не встречаются в других лексемах, таких как '(' и ')', можно определить их "на лету" внутри правила синтаксического анализатора, как только ваша грамматика лексера также содержит идентификатор, подобный токены, лучше всего явно определить токен, как 'functionA' себя внутри грамматики лексера. Определяя их самостоятельно явно, становится яснее, в каком порядке лексер пытается маркировать ваш ввод.

EDIT

И в случае, если вы использовали литерал-токен и определили правило лексера, которое соответствует тому же, как это:

parse : 'functionA' ID;
FA    : 'functionA';
ID    : 'a'..'z'+;

Тогда ANTLR интерпретирует Правило parse следующим образом:

parse : FA ID;