2016-04-21 6 views
1

Я использую javacc в первый раз.JAVACC ERROR выбор конфликт в (...) * конструкция

Я получаю эту ошибку:

Warning: Choice conflict in (...)* construct at line 35, column 43. 
    Expansion nested within construct and expansion following construct 
    have common prefixes, one of which is: <SPACE> 
    Consider using a lookahead of 2 or more for nested expansion. 

Я смотрел на это и узнал, что из-за выбора, который анализатор не знает, что является наиболее подходящим.

void l_zero() : {} { 
TOKEN1 (TOKEN2 TOKEN1)* 
} 

В arrises ошибка как раз перед ( в этой линии, может ли один помочь мне понять это правильно, пожалуйста?

ответ

3

У вас есть (я думаю)

void l_zero() : {} { 
    <TOKEN1> (<SPACE> <TOKEN1>)* 
} 

Проблема заключается в том, что <SPACE> может следовать l_zero. Например, может быть производство, как это где-то

void someNonterminal() : {} { 
    l_zero() <SPACE> <YETANOTHERTOKEN> 
} 

Пусть остальные вход, когда l_zero начинается является

<SOMETOKEN> <SPACE> ... 

После использования <SOMETOKEN> анализатор необходимо решить, следует ли ввести в цикл или вернуться из l_zero. Он не может принять решение на основе следующего токена. Об этом вам сообщает сообщение об ошибке.


Что делать?

В таком случае, если после пробега, следующего за l_zero, не может быть <TOKEN1>? Если это так, парсер может решить, следует ли вводить петлю на основе следующих двух токенов. Вы можете разрешить конфликт с одним из следующих способов:

void l_zero() : {} { 
    <TOKEN1> (LOOKAHEAD(2) <SPACE> <TOKEN1>)* 
} 

или

void l_zero() : {} { 
    <TOKEN1> (LOOKAHEAD(<SPACE> <TOKEN1>) <SPACE> <TOKEN1>)* 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^