2010-08-09 15 views
1

와 MismatchedTokenExceptionANTLR : 나는 다음과 같은 한 유사한 리터럴

rule : A B; 

A : 'a_e' | 'a'; 
B : '_b'; 

입력 :

a_b //dont work 
a_e_b //works 

가 왜 렉서 문제가이 일치를 가지고있다? ANTLR이 'a_b'의 'a_'와 일치하면 되돌아 가거나 미리보기 또는 다른 것을 사용하여 토큰 A와 일치 할 수 없으며 토큰 A를 'a'로 일치시킨 다음 토큰 B를 '_b'와 일치 시키도록 결정해야합니까?

나는 antlr이 작동하는 방식에 대해 아주 기본적인 것을 이해했다고 생각합니다. 필자는 ANTLR 문서와 구글에서 그것을 읽기 위해 노력했다. 하지만 나는 렉서스와 파서와 함께 어색한 경험을했다.

도움을 주셔서 감사합니다.

+0

렉서 규칙으로 규칙이 필요합니까? 구문 분석기 규칙 (문법을 약간 변경)을 사용하여 해결할 수 있습니까? – WayneH

답변

1

'a', '_', 'e'및 'b'를 구별하기 위해 구문 술어를 사용해야합니다.

다음은 작동합니다

grammar T; 

rule : A B; 

B : '_b'; 
A :  ('a_e')=>'a_e' 
    | 'a' ; 

이 'a_e_b'와 'a_b'이 예상대로 구문 분석합니다.

Definitive ANTLR Reference의 13 장을 확인하는 것이 좋습니다.

관련 문제