Правила парсера ANTLR со строковыми литералами - PullRequest
2 голосов
/ 22 сентября 2011

Скажите, если мои правила парсера выглядят так:

rule1 : 'functionA' '(' expression-inside-parenthesis ')'; 
expression-inside-parenthesis: ....;

Но я никогда не определял никаких правил лексера для 'functionA', '(' и ')'. Будут ли они считаться токенами парсером? Для '(' и ')' в любом случае есть только 1 символ, и я полагаю, что не будет никакой разницы. Но для 'functionA', если я никогда не определял это как токен в моих правилах лексера, как парсер мог видеть это как токен?

1 Ответ

2 голосов
/ 22 сентября 2011

JavaMan писал:

как парсер может видеть это как токен?

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;
...