2014-02-05 2 views
2
ANTLR 4.2을 사용하여

, 나는 아주 간단한이 테스트 데이터의 구문 분석을 시도하고 문법 위해 모호성을 해결하지ANTLR4 렉서는

BEGIN : 'begin' ; // match b-e-g-i-n sequence; ambiguity resolves to BEGIN 
ID : [a-z]+ ; // match one or more of any lowercase letter 

실행 : 렉서의 RRV는 테렌스 파의 확실한 ANTLR 4 참조에서 아래의 발췌에 따라, ID 전에 일치하는 닝 상기 테스트 데이터와 ANTLR4 테스트 장비는, 출력

[@0,0:3='RRV0',<4>,1:0] 
[@1,4:4='#',<3>,1:4] 
[@2,5:7='ABC',<4>,1:5] 
[@3,10:9='<EOF>',<-1>,2:0] 
line 1:0 mismatched input 'RRV0' expecting 'RRV' 

나는 값과, 상기 제 토큰 ID 용 < 4>는 볼 수는 'RRV0'I는 렉서 정리 시도

항목 순서. 또한 명시 적 렉서 항목을 통하는 대신 문법 규칙에서 명시 적으로 일치시켜 암시 적 렉서 항목을 사용하려고했습니다. 나는 성냥도 욕심이없는 만들려고 노력했다. 그것들은 나를 위해 성공하지 못했습니다.

어휘 ID 항목을 대문자와 일치하지 않게 변경하면 RRV 항목이 일치하고 구문 분석이 더 진행됩니다.

나는 ANTLR 4.1에서 같은 문제로 시작했다.

ANTLRWorks와 명령 줄에서 동일한 방법으로 두 가지 방법으로 확인했습니다.

ID보다 선호하는 렉서 항목 RRV와 일치하도록 문법을 변경하려면 어떻게해야합니까?

답변

5

문법 순서 결정 정책은 두 개의 서로 다른 렉서 규칙이 동일한 토큰 길이와 일치하는 경우에만 적용됩니다. 길이가 다른 경우, 가장 긴 것이 항상 이깁니다. 귀하의 경우 ID 규칙은 길이가 4 인 토큰과 일치하며 3 문자와 일치하는 RRV 토큰보다 깁니다.

이 전략은 Java와 같은 언어에서 특히 중요합니다. 우리는 단지 다음 입력 className이 식별자 다음에 키워드를 생산하는 것, 문법 순서를 고려하면

CLASS : 'class'; 
ID : [a-zA-Z_] [a-zA-Z0-9_]*; 

: (약간 단순화) 다음과 같은 두 가지 문법 규칙과 함께

String className = ""; 

다음 입력을 고려 Name. 규칙을 재정렬해도 문제가 해결되지 않습니다. 왜냐하면 입력이 class 인 경우에도 CLASS 토큰을 만들 수있는 방법이 없기 때문입니다.

+0

완벽하게 이해할 수 있습니다. 'RRV'를 토큰으로 명시 적으로 일치시키기 위해 문법을 작성할 수 있습니까? 나는 ID를 매칭하도록 선택해야하고 ID를 확인하기 위해 추가 코드를 사용해야한다고 생각한다. "RRV" – Colin