Предположим, у меня есть эта строка для разбора: ABAA и следующую грамматику:Как избежать ложного выбора Предупреждение о конфликте в JavaCC?
public void parse_X() :
{}
{
(
LOOKAHEAD(parse_AA())
parse_AA()
|
parse_AB()
)*
}
public void parse_AA() :
{}
{ <A> <A> }
public void parse_AB() :
{}
{ <A> <B> }
Ясно, что не существует никакой двусмысленности, ни выбора конфликты, но я получаю одно предупреждение, которое утверждает, что есть выбор конфликта в строке 4. Я предполагаю, что JavaCC не может вспомнить, что LOOKAHEAD (parse_AA()) не удалось, поэтому parse_AA() не может следовать.
Полное предупреждение:
Предупреждение: Выбор конфликт (...) * построить в строке 4. расширения вложенной в конструкцию и расширение следующей конструкции имеют общие префиксы, один из которых является: " A " Рассмотрите возможность использования lookahead из 2 или более для вложенного расширения. Парсер генерируется с 0 ошибками и 1 предупреждением.
Как я могу избежать этого предупреждения? Есть ли альтернативная грамматика? (Кроме факторизации общего < A>)
Я попробовал, но это не сработало. Я на 100% уверен, что ничего, что следует за X, начинается с ; на самом деле, если я удалю звезду клине, предупреждение исчезнет (но, конечно, это не решение). –
Возможно, вы правы, но мы отличаемся версией JavaCC. Я проверю его на новейшие и вернусь. –
Я сомневаюсь, что здесь имеет значение версия JavaCC. Я думаю, проблема заключается в том, что может следовать и X. В этом случае JavaCC требует более 1 токена, чтобы посмотреть, нужно ли выйти из цикла. См. Мой отредактированный ответ. –