2013-06-17 2 views
1

마지막 세미콜론을 선택적으로 유지하면서 특정 규칙에 세미콜론을 선택적으로 사용하려고합니다. 현재 우리는 그러나 지금 우리는 'A'에 대한 옵션에 세미콜론을 원하는 후미 세미콜론을 선택적으로 유지하면서 세미콜론을 일부 규칙에 대해 선택적으로 설정합니까?

A; 
C; 
B 

처럼 입력을 구문 분석

A: 'A'; 
B: 'B'; 
C: 'B'; 
SEMICOLON: ';'; 

exprs : expr (SEMICOLON expr)* SEMICOLON?; 

expr : A | B | C 

같은 것을 가지고있다. 어느

A 
C; 
B 

나는 아직도 마지막 세미콜론은 선택 사항이 될 수 있도록 잠시 동안 세미콜론은 선택하고있다에 문제가 있어요 부분 같은 것을 분석하는 것을 의미한다. 이 작업을 수행 할 수있는 좋은 방법이 있습니까? 아니면 마지막 세미콜론이 필요합니까?

는 (의미는 어쨌든에 속한다)

답변

2
이 EXPR에 세미콜론 기호를 이동

(그래서 변경 주시기 괜찮은 제목을 생각 할 수 없습니다).

expr: 
    A SEMICOLON? 
    | (B | C) {LA(1) != EOF}? SEMICOLON 
; 

exprs: 
    expr+ 
; 

업데이트 : B 및 C 분기를 변경하여 미리보기를 사용하도록 결정했습니다.

+0

그러면 C로 끝나는 경우 마지막 줄에 SEMICOLON이 필요하게됩니다. 따라서 마지막 줄이 아닌 경우 세미콜론이 필요합니다. – Will

+0

미리보기를 사용하면 문제가 해결 될 수 있습니다. 내 업데이트 된 솔루션을 참조하십시오. –

+0

SEMICOLON이 없을 때 expr + match를 끝내는 방법이 있습니까? exprs 후 더 많은 토큰이 있기 때문에 EOF를 확인하는 것이 내 경우에는 효과가 없을 것입니다. – Will