2017-01-08 10 views
0

간단한 구문 분석기를 만들려고하면이 오류가 발생합니다. 파서는 (01 | 10 | 00 | 11) * (00 | 11)을 받아 들여야합니다. lookahead = 0을 사용하면 00100100이 정확한 입력을하더라도 오류를 트리거합니다. JavaCC에 00 일 00 일 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

명백히 0011이 주어진 경우, 파서가 00을 읽고 q3()을 호출 한 후 q0()을 선택하고 q3에서 11을 읽는 대신에 여전히 입력이 남아 있더라도 을 선택합니다. 여전히 입력이 남아있을 때 파서가 q0()을 선택하게하는 방법이 있습니까? – tettra

답변

0

내가 작성

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

대신

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

이 문제를 해결할 수 있다고 생각 대안 생산을 선택하는 무한한 진보. END를 먼저 수행하면 우선 순위가 높아지며 프로덕션이 올바르게 재귀 적으로됩니다.