Как исправить ошибку синтаксического анализа (Использование LOOKAHEAD) - PullRequest
0 голосов
/ 24 апреля 2019

У меня проблема с генератором парсера (с javaCC)

У меня есть эта ошибка:

Warning: Choice conflict involving two expansions at
     line 119, column 3 and line 119, column 43 respectively.
     A common prefix is: <CONSTANT>
     Consider using a lookahead of 2 for earlier expansion.
Warning: Choice conflict involving two expansions at
         line 119, column 3 and line 119, column 43 respectively.
         A common prefix is: <CONSTANT>
         Consider using a lookahead of 2 for earlier expansion.

из-за этой части моего кода:

TOKEN : /* OPERATORS */
{
  < POINT : "." >
| < VIRGULE : "," >
}

TOKEN :
{
  < CONSTANT : (< DIGIT >)+ >
| < STRING : ( ["A"-"Z","a"-"z"] )+ >
| < #DIGIT : [ "0"-"9" ] >
}

void number() :
{
}
{
  (< CONSTANT > < POINT > < CONSTANT >) | (< CONSTANT >)
}

Может быть, это потому, что у меня есть 2 CONSTANT с обеих сторон моего выражения "|"

Я видел, что могу использовать LOOKAHEAD, но не понимаю, в чем его полезность

Спасибо за вашу помощь, потому что я не понимаю: (

1 Ответ

1 голос
/ 24 апреля 2019

Нисходящие синтаксические анализаторы, такие как те, которые собирает JavaCC, должны заранее знать, какой выбор выбрать, основываясь на следующем токене или нескольких следующих токенах. Токены, проверенные для принятия этого решения, являются «жетонами предпросмотра».

В идеале решение может быть принято с помощью следующего токена; если нет, то парсер должен буферизовать следующие токены, а также иметь гораздо большую таблицу решений. Не существует алгоритма, который может предсказать, сколько токенов предварительного просмотра необходимо, поэтому JavaCC требует, чтобы вы сказали это. Вот что просят вас сделать эти сообщения об ошибках.

Если два применимых варианта выбора начинаются с одного и того же токена, то этот токен не может помочь анализатору решить, какой из вариантов выбрать, поэтому ему нужно посмотреть еще как минимум еще один токен. Очевидно, что все, кроме POINT после начальных цифр, указывает на то, что NUMBER должен соответствовать второму выбору. Предполагая, что за number не может следовать POINT, тогда POINT после начальных цифр означает, что NUMBER. В этом случае достаточно заглянуть в 2. Однако, если за number может последовать POINT, то анализатору придется посмотреть дальше, чтобы принять решение.

...