it-swarm.com.ru

Стоит ли беспокоиться о "неявном определении токена в правиле парсера"?

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

Что меня беспокоит, так это то, что каждое первое появление токена в правиле парсера подчеркивается желтой волнистой линией, говорящей «Неявное определение токена в правиле парсера».

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

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

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

enter image description here

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

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

26
Matěj Zábský

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

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

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

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

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

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

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

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

0
humblecoder