1
我是antlr4的新手,尽管感动了antlr3年前。我在这里有这个JavaScript语法文件,它认为break语句是表达式语句,而break语句是在前面定义的。规则优先级如何工作?语法规则优先级如何工作?
这里是我的语法文件:
问题是与语句解析。当它看到break语句
break;
它解析它作为表达式语句。因此,下面的单元测试失败,现在被标记为忽略:
我是antlr4的新手,尽管感动了antlr3年前。我在这里有这个JavaScript语法文件,它认为break语句是表达式语句,而break语句是在前面定义的。规则优先级如何工作?语法规则优先级如何工作?
这里是我的语法文件:
问题是与语句解析。当它看到break语句
break;
它解析它作为表达式语句。因此,下面的单元测试失败,现在被标记为忽略:
如何进行规则优先工作?
它按照您的想法工作:规则中的替代项按照它们定义的顺序进行匹配。
真正的问题是因为您在之前定义了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$_]* ;
太感谢你了,巴特!它解决了确切的问题! –
很高兴听到@FrankDu,不客气。 –