Подтвердить что ты не робот

Является ли "Неявное определение токена в правиле парсера", о чем беспокоиться?

Я создаю свою первую грамматику с ANTLR и ANTLRWorks 2. Я в основном закончил сама грамматику (она распознает код, написанный на описанном языке, и строит правильные деревья синтаксического анализа), но я ничего не начал за пределами этого.

Меня беспокоит то, что каждое первое появление токена в правиле парсера подчеркивается желтым скрежетом, в котором говорится: "Неявное определение токена в правиле парсера".

Например, в этом правиле 'var' имеет этот squiggle:

variableDeclaration: 'var' IDENTIFIER ('=' expression)?;

Как это выглядит точно:

enter image description here

Странно то, что сам ANTLR, похоже, не имеет в виду эти правила (при тестировании тестовой установки я не вижу ни одного из этих предупреждений в выводе генератора парсера, просто что-то о некорректной версии Java, установленной на моем машина), так что просто ANTLRWorks жалуется.

О чем беспокоиться или я должен игнорировать эти предупреждения? Должен ли я объявлять все токены явно в правилах lexer? Большинство exaples в официальной библии The Defintive ANTLR Reference, похоже, выполняется точно так же Я пишу код.

4b9b3361

Ответ 1

Я очень рекомендую исправлять все экземпляры этого предупреждения в коде любой важности.

Это предупреждение было создано (фактически мной), чтобы предупредить вас о следующих ситуациях:

shiftExpr : ID (('<<' | '>>') ID)?;

Так как ANTLR 4 побуждает код действия записываться в отдельных файлах на целевом языке, а не встраивать их непосредственно в грамматику, важно различать << и >>. Если для этих операторов явно не были созданы токены, им будут назначены произвольные типы, и для ссылки на них не будут доступны именованные константы.

Это предупреждение также помогает избежать следующих проблемных ситуаций:

  • Правило анализатора содержит ссылку с орфографической ошибкой. Без предупреждения это может привести к тихим созданием дополнительного токена, который никогда не может быть сопоставлен.
  • В правиле парсера содержится непреднамеренная ссылка на токен, например:

    number : zero | INTEGER;
    zero   : '0'; // <-- this implicit definition causes 0 to get its own token
    

Ответ 2

Если вы пишете грамматику лексера, которая не будет использоваться в нескольких грамматических установках парсера, вы можете игнорировать это предупреждение, показанное ANTLRWorks2.