Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 语法规则的优先级是如何工作的?_Java_Parsing_Antlr_Antlr4 - Fatal编程技术网

Java 语法规则的优先级是如何工作的?

Java 语法规则的优先级是如何工作的?,java,parsing,antlr,antlr4,Java,Parsing,Antlr,Antlr4,我是antlr4的新手,尽管我在3年前接触过antlr4。我这里有一个JavaScript语法文件,它认为break语句是表达式语句,而break语句是在前面定义的。规则优先级是如何工作的 这是我的语法文件: 问题在于语句解析。当它看到break语句时 break 它将其解析为表达式语句。因此,以下单元测试失败,并被标记为暂时忽略: 规则优先级是如何工作的 它的工作原理与您所想的一样:规则中的备选方案按照它们定义的顺序进行匹配 真正的问题是因为您在关键字规则之前定义了标识符规则。因此,输入'

我是antlr4的新手,尽管我在3年前接触过antlr4。我这里有一个JavaScript语法文件,它认为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$\]* ;
非常感谢你,巴特!它解决了确切的问题!非常感谢你,巴特!它解决了确切的问题!