음화 메타 문자 ~
은 ANTLR의 렉서 및 파서 규칙에서 어떻게 사용될 수 있습니까?렉서 및 파서 규칙 내에서의 부정 내기
14
A
답변
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 ;
설명해 주셔서 감사합니다. 나는 파서 규칙에서 발생할 때'~'연산자가 토큰에 적용된다는 것을 몰랐다. – Gunther
@ 군터, 문제 없습니다. 나는 종종 내 대답에 간략하게 언급하고있다. 그래서 지금부터 나는이 Q & A에 링크 할 수있다. W.r. 아마도 org.antlr.tool.Strip' 클래스는 ANTLR 문법 파일에서 모든 사용자 정의 코드를 제거하기 때문에 ANTLR 문법을 파싱 할 때 더 쉽게 사용할 수 있습니다. –