语法规则优先级如何工作?

时间:2013-10-05 17:01:53

标签: java parsing antlr antlr4

我是antlr4的新手,尽管多年前触及了antlr3。我这里有这个JavaScript语法文件,它认为break语句是表达式语句,而break语句是先前定义的。规则优先级如何工作?

这是我的语法文件:

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

问题在于语句解析。当它看到break语句时

break;

它将其解析为Expression语句。因此,以下单元测试失败并暂时被标记为忽​​略:

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

1 个答案:

答案 0 :(得分:3)

  

规则优先权如何运作?

它按您的想法运作:规则中的替代方案按照它们定义的顺序进行匹配。

真正的问题是因为您在关键字规则之前定义了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$_]*
    ;