2012-12-16 5 views
2

JavaCC에서 다음 프로덕션 규칙을 작성하려고하는데 선택 충돌 오류가 발생합니다. 미리보기를 사용하여 문제를 해결하는 방법을 알고 있지만 과제를 위해 사용할 수 없다는 인상하에 있습니다.미리보기없이 선택 충돌 제거 - JavaCC

void statement() #void:{} 
{ 
    <ID> (<ASSIGN>(expression() | <STRING>))| <LEFTBRACKET>argument_list()<RIGHTBRACKET> 
| <NOT>expression() 
| <QUESTIONMARK><ID> 
| <LEFTBRACE>(statement()<SEMICOLON>)*<RIGHTBRACE> 
| <IF>condition()<THEN>statement()     <-- Conflict, parser will always pick this one 
| <IF>condition()<THEN>statement()<ELSE>statement() <-- 
| <WHILE>condition()<DO>statement() 
| {} 
} 

의견을 보내 주시면 감사하겠습니다.

답변

3

이것은 JavaCC lookahead tutorial의 고전적인 "dangling else"문제입니다. 두 개의 if 작품을 하나의 if-then-else 작품 (선택 사항 : else)으로 교체해야합니다. 당신은이처럼 else 앞에 LOOKAHEAD(1)을 추가해야합니다 :

| <IF>condition()<THEN>statement() 
| <IF>condition()<THEN>statement()<ELSE>statement() 

는 답장을

| <IF>condition()<THEN>statement() [LOOKAHEAD(1) <ELSE>statement()] 
+0

안녕하세요 덕분된다. 나는이 솔루션을 가지고 있었지만 우리가 lookaheads를 사용할 수 있는지 확신하지 못했다. 내가 이것을 사용한다면 파서는 여전히 LL (1)이 될 것인가? 또한이 문제에 대한 다른 해결책이 없다면 올바른 대답이라고 생각합니다! 다시 한 번 감사드립니다 – TomSelleck

+0

@Tomcelic'LOOKAHEAD (1) '을 추가하면'LL (2)'이되지만, 100 % 확실하지는 않다고 생각합니다. 문법은 ''을 추가하지 않으면 애매하지만, 파서는 그것을 취하여 'else'를 가장 안쪽의'if'와 짝을 지을 것입니다. – dasblinkenlight

+0

이것이 효과가 있다고 생각하십니까? /* IF 문 */ 무효 if_statement() {} { 조건() 문() ( 문() | {}) } – TomSelleck