2011-11-27 6 views

답변

23

lexer and parser rules에서 부정 할 수 있습니다.

렉서 규칙 안에는 문자를 무효로 할 수 있으며 파서 규칙 내에서 토큰 (렉서 규칙)을 무효화 할 수 있습니다. 그러나 렉서 및 파서 규칙은 각각 단일 문자 또는 단일 토큰 만 무효화 할 수 있습니다.

예제 몇 : 소문자 ASCII 문자를 제외한 하나 이상의 문자와 일치하기

렉서 규칙

, 당신은 할 수 있습니다 :

NO_LOWERCASE : ~('a'..'z')+ ; 

(부정 - 메타 문자

, 은 +보다 우선 순위가 높기 때문에 위의 규칙은 (~('a'..'z'))+과 같습니다.

'a'..'z'는 하나의 문자와 일치 (및 부정 할 그 때문에 수), 그러나 다음과 같은 규칙이 유효하지

참고 : (분명히)이 문자와 일치

ANY_EXCEPT_AB : ~('ab') ; 

'ab' 때문에, 그것은 부정 할 수 없습니다.

ANY_EXCEPT_AB 
    : 'a' ~'b' // any two chars starting with 'a' followed by any other than 'b' 
    | ~'a' . // other than 'a' followed by any char 
    ; 

파서 규칙

내부 파서 규칙, ~ 특정 토큰, 또는 둘 이상을 부정 :하지 'ab' 2 문자로 구성되어 토큰을 일치하지만,하려면 다음을 수행해야 할 것 토큰. 예를 들어, 다음 토큰은 정의 :

p : ~A ; 

을 그리고 당신은 B 제외한 모든 토큰을 일치시킬 경우 :

A : 'A'; 
B : 'B'; 
C : 'C'; 
D : 'D'; 
E : 'E'; 

당신이 지금 A 제외한 모든 토큰을 일치 시키려면, 당신이 할 D, 당신은 할 수 있습니다 :

p : ~(B | D) ; 

을 그러나다음 A 이외의 다른 두 개의 토큰을 일치시킬 경우, 당신은 하지

p : ~(A B) ; 

그냥 렉서 규칙, 당신은 하나의 토큰 이상을 부정 할 수 없다. 파서 규칙에서 . (DOT) 문자가 하지 경기는 렉서 규칙 내에서와 마찬가지로 모든 문자를한다는 것을

P 
    : A ~B 
    | ~A . 
    ; 

참고 : 위를 달성하기 위해, 당신은 할 필요가있다. 구문 분석기 규칙에서는 모든 토큰 (이 경우 임의의 토큰)과 일치합니다 (이 경우 A, B, C, D 또는 E).

파서 규칙을 무효화 할 수는 없습니다. 다음은 불법입니다 :

p : ~a ; 
a : A ; 
+0

설명해 주셔서 감사합니다. 나는 파서 규칙에서 발생할 때'~'연산자가 토큰에 적용된다는 것을 몰랐다. – Gunther

+0

@ 군터, 문제 없습니다. 나는 종종 내 대답에 간략하게 언급하고있다. 그래서 지금부터 나는이 Q & A에 링크 할 수있다. W.r. 아마도 org.antlr.tool.Strip' 클래스는 ANTLR 문법 파일에서 모든 사용자 정의 코드를 제거하기 때문에 ANTLR 문법을 파싱 할 때 더 쉽게 사용할 수 있습니다. –