我是 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$_]* ;