2013-10-05 6 views
1

antlr4를 처음 접했을 때에도 antlr4를 처음 접했습니다. 여기에이 자바 스크립트 문법 파일이 있는데 break 문은 표현 문이라고 생각하고 break 문은 먼저 정의합니다. 규칙 우선 순위는 어떻게 작동합니까?문법 규칙 우선 순위는 어떻게 작동합니까?

https://github.com/frankdu/minijs/blob/master/antlr/src/main/resources/org/minijs/parser/antlr/JavaScript.g4

문제는 문장 구문 분석이다 :

여기 내 문법 파일입니다. 이 break 문을

break;

을 볼 때이 표현 문으로 구문 분석합니다. 따라서, 아래의 단위 테스트가 실패하고 지금은 무시 됨으로 표시 :

https://github.com/frankdu/minijs/blob/master/core/src/test/java/org/minijs/core/parser/BreakStatementTest.java

답변

2

어떻게 규칙의 우선 순위 작동합니까?

생각대로 작동합니다. 규칙 내에서 대안이 정의 된 순서대로 일치합니다.

실제 문제는 규칙 앞에 키워드 규칙이 정의되어 있기 때문입니다. 이 때문에 입력 'break'IDENTIFIER으로 토큰 화되어 있으며 primaryExpression과 일치합니다.

해결책은 간단하다 : 장소 IDENTIFIER 규칙 키워드 규칙 후 :

// Keywords 
VAR:  'var'; 
IF:   'if'; 
WHILE:  'while'; 
DO:   'do'; 
FOR:  'for'; 
CONTINUE: 'continue'; 
BREAK:  'break'; 
RETURN:  'return'; 
FUNCTION: 'function'; 
NEW:  'new'; 
DELETE:  'delete'; 
IN:   'in'; 
INSTANCEOF: 'instanceof'; 

IDENTIFIER 
    : [a-zA-Z$_] [a-zA-Z0-9$_]* 
    ; 
+0

이 너무 많은 바트를 주셔서 감사합니다! 정확한 문제를 해결합니다! –

+0

@FrankDu, 듣고 반가워요. –

관련 문제