2016-04-21 23 views
1

Ich benutze javacc zum ersten Mal.JAVACC ERROR Wahlkonflikt in (...) * Konstrukt

Ich erhalte diese Fehlermeldung:

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. 

Ich habe in diese sah und fand heraus, es ist aufgrund einer Wahl, die der Parser nicht weiß, welche am besten geeignet ist.

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

Die Fehler arrises kurz vor dem ( in dieser Linie, könnte helfen mir einer diese bitte richtig zu verstehen?

Antwort

3

Sie haben (ich glaube)

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

Das Problem ist, dass ein <SPACE> ein l_zero folgen kann. Zum Beispiel könnte es eine Produktion wie diese irgendwo

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

den verbleibenden Eingang Angenommen, wenn l_zero beginnt

<SOMETOKEN> <SPACE> ... 

Nach dem Verzehr der <SOMETOKEN> der Parser muss entscheiden, ob die Schleife eingeben oder Rückkehr aus l_zero. Es kann nicht aufgrund des nächsten Tokens entscheiden. Dies ist, was die Fehlermeldung Ihnen sagt.


Was ist zu tun?

Ist es möglich, dass hinter einem Leerzeichen, das auf l_zero folgt, kein <TOKEN1> folgt? Wenn dies der Fall ist, kann der Parser entscheiden, ob er die Schleife basierend auf den nächsten zwei Tokens eingibt.

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

oder

void l_zero() : {} { 
    <TOKEN1> (LOOKAHEAD(<SPACE> <TOKEN1>) <SPACE> <TOKEN1>)* 
} 
: Sie können den Konflikt mit einer der folgenden lösen