2013-10-05 53 views
1

我是antlr4的新手,儘管感動了antlr3年前。我在這裏有這個JavaScript語法文件,它認爲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

如何進行規則優先工作?

它按照您的想法工作:規則中的替代項按照它們定義的順序進行匹配。

真正的問題是因爲您在之前定義了IDENTIFIER規則您的關鍵字規則。因此,輸入'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,不客氣。 –