2013-10-10 2 views
0

Предположим, у меня есть эта строка для разбора: 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>)

ответ

0

Попробуйте следующее

public void parse_X() : 
{} 
{ 
    (( 
    LOOKAHEAD(parse_AA()) 
    parse_AA() 
    | 
    parse_AB() 
    ))* 
} 

Если это не работает, проблема в том, что есть что-то, что следует за X, который может начать с <A>.


Редактировать.

Так что не работает, попробуйте следующее:

public void parse_X() : 
{} 
{ 
    (LOOKAHEAD(<A>) 
    ( 
    LOOKAHEAD(parse_AA()) 
    parse_AA() 
    | 
    parse_AB() 
    ) 
)* 
} 

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