2013-10-05 49 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,不客气。 –