Java 语法规则的优先级是如何工作的?
我是antlr4的新手,尽管我在3年前接触过antlr4。我这里有一个JavaScript语法文件,它认为break语句是表达式语句,而break语句是在前面定义的。规则优先级是如何工作的 这是我的语法文件: 问题在于语句解析。当它看到break语句时Java 语法规则的优先级是如何工作的?,java,parsing,antlr,antlr4,Java,Parsing,Antlr,Antlr4,我是antlr4的新手,尽管我在3年前接触过antlr4。我这里有一个JavaScript语法文件,它认为break语句是表达式语句,而break语句是在前面定义的。规则优先级是如何工作的 这是我的语法文件: 问题在于语句解析。当它看到break语句时 break 它将其解析为表达式语句。因此,以下单元测试失败,并被标记为暂时忽略: 规则优先级是如何工作的 它的工作原理与您所想的一样:规则中的备选方案按照它们定义的顺序进行匹配 真正的问题是因为您在关键字规则之前定义了标识符规则。因此,输入'
break代码>
它将其解析为表达式语句。因此,以下单元测试失败,并被标记为暂时忽略:
规则优先级是如何工作的
它的工作原理与您所想的一样:规则中的备选方案按照它们定义的顺序进行匹配
真正的问题是因为您在关键字规则之前定义了标识符
规则。因此,输入'break'
被标记为标识符
,因此匹配为主表达式
解决方案很简单:将标识符
规则放在关键字规则之后:
// 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$_]*
;
//关键词
VAR:‘VAR’;
如果:‘如果’;
WHILE:‘WHILE’;
DO:‘DO’;
因为‘为了’;
继续:"继续";;
休息:“休息”;
RETURN:‘RETURN’;
功能:‘功能’;
新:"新";;
删除:“删除”;
IN:'IN';
INSTANCEOF:'INSTANCEOF';
标识符
:[a-zA-Z$\][a-zA-Z0-9$\]*
;
规则优先级是如何工作的
它的工作原理与您所想的一样:规则中的备选方案按照它们定义的顺序进行匹配
真正的问题是因为您在关键字规则之前定义了标识符
规则。因此,输入'break'
被标记为标识符
,因此匹配为主表达式
解决方案很简单:将标识符
规则放在关键字规则之后:
// 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$_]*
;
//关键词
VAR:‘VAR’;
如果:‘如果’;
WHILE:‘WHILE’;
DO:‘DO’;
因为‘为了’;
继续:"继续";;
休息:“休息”;
RETURN:‘RETURN’;
功能:‘功能’;
新:"新";;
删除:“删除”;
IN:'IN';
INSTANCEOF:'INSTANCEOF';
标识符
:[a-zA-Z$\][a-zA-Z0-9$\]*
;
非常感谢你,巴特!它解决了确切的问题!非常感谢你,巴特!它解决了确切的问题!