2

我是 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

4

1 回答 1

4

规则优先级如何工作?

它如您所想的那样工作:规则中的替代项按照它们定义的顺序进行匹配。

真正的问题是因为您在关键字规则IDENTIFIER之前定义了规则。因此,输入'break'被标记为 anIDENTIFIER并因此匹配为 a primaryExpression

解决方案很简单:将IDENTIFIER规则放在关键字规则之后:

// 关键字
VAR:'var';
如果如果';
虽然:'同时';
渡渡鸟';
为:“为”;
继续:'继续';
休息:'休息';
返回:'返回';
功能:'功能';
新:'新';
删除:'删除';
在:“在”;
实例:'实例';

标识符
    : [a-zA-Z$_] [a-zA-Z0-9$_]*
    ;
于 2013-10-06T08:17:23.180 回答