我是 antlr4 的新手,尽管 antlr3 年前接触过。我这里有这个 JavaScript 语法文件,它认为 break 语句是表达式语句,而 break 语句是前面定义的。规则优先级如何工作?
这是我的语法文件:
问题在于语句解析。当它看到 break 语句时
break;
它将其解析为 Expression 语句。因此,以下单元测试失败并暂时被标记为忽略:
我是 antlr4 的新手,尽管 antlr3 年前接触过。我这里有这个 JavaScript 语法文件,它认为 break 语句是表达式语句,而 break 语句是前面定义的。规则优先级如何工作?
这是我的语法文件:
问题在于语句解析。当它看到 break 语句时
break;
它将其解析为 Expression 语句。因此,以下单元测试失败并暂时被标记为忽略:
规则优先级如何工作?
它如您所想的那样工作:规则中的替代项按照它们定义的顺序进行匹配。
真正的问题是因为您在关键字规则IDENTIFIER之前定义了规则。因此,输入'break'被标记为 anIDENTIFIER并因此匹配为 a primaryExpression。
解决方案很简单:将IDENTIFIER规则放在关键字规则之后:
// 关键字
VAR:'var';
如果如果';
虽然:'同时';
渡渡鸟';
为:“为”;
继续:'继续';
休息:'休息';
返回:'返回';
功能:'功能';
新:'新';
删除:'删除';
在:“在”;
实例:'实例';
标识符
: [a-zA-Z$_] [a-zA-Z0-9$_]*
;