Является ли "Неявное определение токена в правиле парсера", о чем беспокоиться?
Я создаю свою первую грамматику с ANTLR и ANTLRWorks 2. Я в основном закончил сама грамматику (она распознает код, написанный на описанном языке, и строит правильные деревья синтаксического анализа), но я ничего не начал за пределами этого.
Меня беспокоит то, что каждое первое появление токена в правиле парсера подчеркивается желтым скрежетом, в котором говорится: "Неявное определение токена в правиле парсера".
Например, в этом правиле 'var'
имеет этот squiggle:
variableDeclaration: 'var' IDENTIFIER ('=' expression)?;
Как это выглядит точно:
![enter image description here]()
Странно то, что сам ANTLR, похоже, не имеет в виду эти правила (при тестировании тестовой установки я не вижу ни одного из этих предупреждений в выводе генератора парсера, просто что-то о некорректной версии Java, установленной на моем машина), так что просто ANTLRWorks жалуется.
О чем беспокоиться или я должен игнорировать эти предупреждения? Должен ли я объявлять все токены явно в правилах lexer? Большинство exaples в официальной библии The Defintive ANTLR Reference, похоже, выполняется точно так же Я пишу код.
Ответы
Ответ 1
Я очень рекомендую исправлять все экземпляры этого предупреждения в коде любой важности.
Это предупреждение было создано (фактически мной), чтобы предупредить вас о следующих ситуациях:
shiftExpr : ID (('<<' | '>>') ID)?;
Так как ANTLR 4 побуждает код действия записываться в отдельных файлах на целевом языке, а не встраивать их непосредственно в грамматику, важно различать <<
и >>
. Если для этих операторов явно не были созданы токены, им будут назначены произвольные типы, и для ссылки на них не будут доступны именованные константы.
Это предупреждение также помогает избежать следующих проблемных ситуаций:
- Правило анализатора содержит ссылку с орфографической ошибкой. Без предупреждения это может привести к тихим созданием дополнительного токена, который никогда не может быть сопоставлен.
-
В правиле парсера содержится непреднамеренная ссылка на токен, например:
number : zero | INTEGER;
zero : '0'; // <-- this implicit definition causes 0 to get its own token
Ответ 2
Если вы пишете грамматику лексера, которая не будет использоваться в нескольких грамматических установках парсера, вы можете игнорировать это предупреждение, показанное ANTLRWorks2.