ANTLRWorks предупреждает об отсутствии правил запуска

пожалуйста, помогите новичку понять это предупреждение в ANTLWorks:

[11:10:15] предупреждение(138): BooleanExpr.g:0:1: грамматика BooleanExpr: нет начального правила (очевидно, что EOF не может следовать ни одному правилу)

Вот как выглядит определение моей грамматики:

grammar BooleanExpr;
booleanExpr
    :   andExpr ('OR' andExpr)*;
andExpr :   notExpr (('AND' | ' ' ) notExpr)*;
notExpr :   kppExpr ('NOT' kppExpr);
kppExpr :   keywordExpr|phraseExpr|proximityExpr|'(' booleanExpr ')';
keywordExpr
    :CHAR+;
phraseExpr
    :   '"' keywordExpr '"';
proximityExpr
    :   keywordExpr|phraseExpr '~' INT;
CHAR    :   ('A'..'Z') | ('a'..'z');
INT :   '0'..'9'+;

Большое спасибо!


person Ihor M.    schedule 11.06.2013    source источник


Ответы (2)


Любая грамматика нуждается в так называемом стартовом правиле. Начальное правило — это правило, на которое не ссылается другое правило. Если в вашей грамматике нет такого правила, генератор ANTLR выдаст предупреждение:

no start rule (no rule can obviously be followed by EOF)

Чтобы избежать этого, добавьте в свою грамматику фиктивное правило начала:

start_rule: someOtherRule; 
person Sanjiv    schedule 12.12.2014
comment
Должно ли start_rule быть волшебным жестко закодированным значением? Добавление этого правила мне не помогло. - person Basil Bourque; 01.02.2021

Обычно синтаксические анализаторы пишутся для анализа всего ввода (от начала до конца файла). Грамматика, используемая для этой задачи, обычно включает следующее правило.

compilationUnit : someElement* EOF;

Это правило гласит, что единицей компиляции является последовательность из нуля или более элементов, заканчивающаяся в конце файла. Если ссылка EOF опущена, у вас может быть правило, подобное следующему.

compilationUnit : someElement*;

Проблема с этой формой заключается в ее способности обрабатывать ошибки. Если ввод содержит синтаксическую ошибку, то вместо того, чтобы пытаться ее исправить и/или восстановить, правило просто возвращает значение (пустая последовательность является допустимой интерпретацией этого compilationUnit правила, поэтому она предпочтительнее более длинной последовательности, содержащей недопустимый элемент).

ANTLRWorks сообщает вам, что грамматика не содержит правила, оканчивающегося явной ссылкой EOF, что может быть проблематично, если вы собираетесь анализировать полные файлы.

person Sam Harwell    schedule 11.06.2013
comment
Я не планирую анализировать файлы, моя цель здесь - проверить логические выражения, которые будут храниться как объекты String. Мне не имеет смысла добавлять EOF в конец правила. Как в этом случае может поддерживаться обработка ошибок? - person Ihor M.; 11.06.2013
comment
Если вы планируете анализировать всю строку, обработайте ее как файл и добавьте EOF в конец начального правила. - person Sam Harwell; 11.06.2013
comment
Хорошо, мне также добавить символ EOF в конец строки? - person Ihor M.; 11.06.2013
comment
Спасибо за ваши ответы. Я признателен за это. - person Ihor M.; 11.06.2013
comment
@ИгорМ. Нет. EOF просто означает конец ввода, который в вашем случае является концом строки. - person Sam Harwell; 12.06.2013