2011-06-11 2 views
2

는 EBNF에 다음과 같은 규칙을 가정 비를 prdocues하는ANTLR : 비 LL (*)를 해결하는 문제

list : '(' datum+ '.' datum ')' 
    | '(' datum* ')' 
    | ABBREV_PREFIX datum 
    ; 

: 같은 목록 규칙에 대한

<datum> --> <simple datum> | <compound datum> 
<simple datum> --> <boolean> | <number> 
    | <character> | <string> | <symbol> 
<symbol> --> <identifier> 
<compound datum> --> <list> | <vector> 
<list> --> (<datum>*) | (<datum>+ . <datum>) 
     | <abbreviation> 
<abbreviation> --> <abbrev prefix> <datum> 
<abbrev prefix> --> ' | ` | , | ,@ 
<vector> --> #(<datum>*) 

에서, ANTLR 문법이 보일 것이다 알트 1,2에 대한 LL (*) 결정 오류. 이 문장을 리팩터링하려고 시도했지만 작동하는 것을 얻을 수 없습니다. 예

:

list : '(' datum* (datum'.' datum)? ')' 
    | ABBREV_PREFIX datum 
    ; 

같은 오류를 생성한다. 내게 가장 큰 문제는 하나의 규칙에는 +가 있고 다른 하나에는 * *이 사용되므로 왼쪽으로 분해하는 것이 일반적으로 그렇게 간단하지 않다는 것입니다.

답변

1

귀하의 목록 규칙 :

 // A  B 
     // |  | 
list // |  | 
    : '(' datum* (datum '.' datum)? ')' 
    | ABBREV_PREFIX datum 
    ; 
datum이 있어야 할 때

은 모르는 "하위"- 생산 규칙에 의해 일치 또는 B. 다음과 같이해야합니다.

list 
    : '(' (datum+ ('.' datum)?)? ')' // also matches: '(' datum* ')' 
    | ABBREV_PREFIX datum 
    ; 
0

방법에 대해 :

list : '(' ')' 
    | '(' datum+ ('.' datum)? ')' 
    | ABBREV_PREVIX_DATUM 
    ;