2017-01-08 9 views
0

単純なパーサーを作成しようとするとこのエラーが発生します。パーサーは(01 | 10 | 00 | 11)*(00 | 11)を受け入れる必要があります。 lookahead = 0を使用すると、正しい入力であっても00100100がエラーを引き起こします。 JavaCCのは00 1 00 1 00、いない00 10 01 00として、それを読んしかし、私はそれを修正するために先読みを追加するとき、私はJavaCCでLookahead> 0のときParseExceptionエラーが発生する

Exception in thread "main" ParseException: Encountered "" at line 1, column 6. 
Was expecting one of: 

    at GS.generateParseException(GS.java:453) 
    at GS.jj_consume_token(GS.java:337) 
    at GS.q3(GS.java:50) 
    at GS.q0(GS.java:17) 
    at GS.q1(GS.java:32) 
    at GS.q0(GS.java:14) 
    at GS.q3(GS.java:43) 
    at GS.q0(GS.java:17) 
    at GS.main(GS.java:8) 

を得たので誰も私が原因を見つけるのを助けることができますか? ご協力いただければ幸いです。あなたはインラインQ3、あなたはそのQ0が再帰残っている見ることができれば、あなたが必要とするので:ありがとう

options{ 
    LOOKAHEAD = 4; 
} 

PARSER_BEGIN(GS) 
public class GS { 
    public static void main(String args[]) throws ParseException { 
     GS parser = new GS(System.in); 
     parser.q0(); 
    } 
} 
PARSER_END(GS) 

TOKEN: 
{ 
    <END : (["\n", "\r", "\t"])+> 
} 


void q0():{} 
{ 
    "1" q1() | "0" q2() | "00" q3() | "11" q3() 
} 

void q1():{} 
{ 
    "0" q0() 
} 

void q2():{} 
{ 
    "1" q0() 
} 

void q3():{} 
{ 
    q0() | <END> 
} 
+0

私は 'DEBUG_PARSER'をtrueに設定することをお勧めします。 –

+0

おそらく 'DEBUG_TOKEN_MANGER'です。 'END'トークンを見つけられないと私は思っています。入力の最後の数字の直後に改行、改行、またはタブがあることを確かめていますか?どうやら –

+0

パーサは00とコールQ3(読み取り後)、0011を与えられたのではなく、(Q0を選択する)、それは入力左はまだありますにもかかわらずを選択Q3に、11をお読みください。まだ入力が残っているときにパーサーがq0()を選択するように強制する方法はありますか? – tettra

答えて

0

は私が書い

void q3():{} 
{ 
    <END> |q0() 
} 

代わりの

void q3():{} 
{ 
    q0() | <END> 
} 

は、問題を解決することだと思います代替生産を選択する無限の先見性。最初にENDを置くと優先度が高くなり、プロダクションは正しく再帰的になります。

関連する問題