2017-05-10 1 views
0

I는 다음과 같은 두 가지 유형으로 될 수 ifElse 문이JavaCC - 반환 유형에 따라 선택 하시겠습니까?

a) ifElse (조건 expression_bool_result, expression_bool_result)

expression_bool_result 어느/TRUE FALSE의 결과 일 수있는 반면 및(), 또는() ==! = .... 또는 상기 ifElse

b) ifElse (조건 expression_arith_result, expression_arith_result)

expression_arith_result 어떤 번호, 반환 상기 함수 계산 결과가 될 수도 있고, 반면 번호 ... (또는 furthe r ifElse)

저는 javacc을 처음 사용하기 때문에 파서가 명확한 결정을 내릴 수 있도록 어떻게 프로덕션을 만들 수 있는지 묻고 싶습니다. 지금까지 내가 말할 수있는 - - (ifelse에 대한) 내 문법이 모호 것을 의미한다

은 현재 내가 경고

Warning: Choice conflict involving two expansions at 
line 824, column 5 and line 825, column 5 respectively. 
A common prefix is: "ifElse" "(" 
Consider using a lookahead of 3 or more for earlier expansion. 

를 얻을.

명확하게 기록 할 방법이 없다면 어떻게 제안 된 미리보기를 만들 수 있습니까?

미리 의견을 보내 주셔서 감사합니다.

답변

0

미리보기 양이 일정하지 않아 모든 경우에이 모호성을 해결할 수 없습니다. 유효한 expression_arith_result을 형성하는 임의의 긴 토큰 스트림을 가질 수는 있지만 비교 연산자와 다른 산술 값이 이어져 expression_bool_result으로 바뀝니다.

두 개의 임의 표현식을 사용하는 단일 ifElse 문을 사용하는 것이 해결책입니다. 두 표현 사이의 형식에서 필요한 동의는 문법이 아닌 의미론의 문제 일 것입니다.

+0

Thx! 당신이 나에게 예제 (또는 링크)를 제공해 줄 수 있습니까? 나는 당신의 마지막 문장/권고를 올바르게 이해하는지 확신하지 못합니다. – mindpixel

0

제이슨의 대답은 고정 된 길이의 미리보기를 사용하여 선택 사항을 해결할 수 없다는 점에서 정확합니다. 그러나 JavaCC는 미리보기의 고정 길이로 제한하지 않습니다. 그래서 당신은 다음을 할 수 있습니다.

void IfExpression() : 
{ } 
{ LOOKAHEAD(<IFELSE> "(" Condition() "," BooleanExpression()) 
    BooleanIfExpression() 
| 
    ArithmeticIfExpression() 
} 
관련 문제