我是antlr4的新手,尽管多年前触及了antlr3。我这里有这个JavaScript语法文件,它认为break语句是表达式语句,而break语句是先前定义的。规则优先级如何工作?
这是我的语法文件:
问题在于语句解析。当它看到break语句时
break;
它将其解析为Expression语句。因此,以下单元测试失败并暂时被标记为忽略:
答案 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$_]* ;