Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.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
ANTLR4缺少规则定义_Antlr4_Antlrworks - Fatal编程技术网

ANTLR4缺少规则定义

ANTLR4缺少规则定义,antlr4,antlrworks,Antlr4,Antlrworks,我一直在努力破解我的ANTLR4语法,试图一次消除它的所有歧义和lexer规则错误。我似乎做什么都不能解决问题。这些lexer规则给出的错误如下: Identifier: Letter (Letter | Digit | Und)+; Keyword : Letter+; Param: Number | Identifier; Statement: Keyword Lpr Param+ Rpr; Block: Lbc Statement+ Rbc; 正如你们可能已经注意到的,他们的一个共同

我一直在努力破解我的ANTLR4语法,试图一次消除它的所有歧义和lexer规则错误。我似乎做什么都不能解决问题。这些lexer规则给出的错误如下:

Identifier: Letter (Letter | Digit | Und)+;
Keyword   : Letter+;
Param: Number | Identifier;
Statement: Keyword Lpr Param+ Rpr;
Block: Lbc Statement+ Rbc;
正如你们可能已经注意到的,他们的一个共同点是字母。此令牌和其他令牌定义为:

fragment Digit: '0'..'9';
fragment Letter: ('A'..'Z');
Und: '_';
Lpr: '(';
Rpr: ')';
除非ANTLR不允许使用具有潜在相同结果的多个定义,否则我无法发现这如何会导致歧义。

ANTLR仅(实际上)适用于明确的语法。允许某些左递归,可以使用谓词和lexer模式来处理/避免歧义

然而,ANTLR将允许具有潜在相同结果的多个定义

它总是通过选择第一个这样的冲突规则来实现这一点。其余的冲突规则被隐藏,这意味着就所有实际目的而言,它们并不存在。几乎可以肯定的是,这是一个非常不理想的结果。

只有ANTLR(真正)能够处理明确的语法。允许某些左递归,可以使用谓词和lexer模式来处理/避免歧义

然而,ANTLR将允许具有潜在相同结果的多个定义


它总是通过选择第一个这样的冲突规则来实现这一点。其余的冲突规则被隐藏,这意味着就所有实际目的而言,它们并不存在。几乎可以肯定,这是一个非常不理想的结果。

谢谢你为我澄清这一点。不幸的是,这意味着我最初的问题仍然存在。是什么导致所有这些规则抛出相同的错误?所有最终依赖于
关键字
(完全隐藏)的规则将因相同的错误而失败(
编号
似乎未定义)。仅切换
标识符
关键字
的顺序将不起作用(所有仅包含字母的标识符都将作为关键字使用)。通常,关键字将被显式指定,后跟catchall规则,例如
标识符
规则;这意味着任何未明确命名为关键字的
字母+
都是标识符。我现在明白了。问题是,我试图定义一种语法,允许定义额外的关键字(关键字基本上是函数名),所以我试图只在lexer中定义语法,在解析器中定义语义。因此,它归结为经典关键字与标识符的问题。这已经讨论过好几次了。使用您喜欢的搜索引擎寻找可能的解决方案(包括ANTLR邮件列表中的my)。函数名实际上不是关键字(从语法角度)。它们是在语法分析器规则中表示函数名的结构上可识别的标识符。类似地,变量是标识符,但在它们自己的解析器规则中定义的不同结构关系中出现。生成的解析树为区分标识符类型提供了一个明确(且易于使用)的基础。感谢您为我澄清这一点。不幸的是,这意味着我最初的问题仍然存在。是什么导致所有这些规则抛出相同的错误?所有最终依赖于
关键字
(完全隐藏)的规则将因相同的错误而失败(
编号
似乎未定义)。仅切换
标识符
关键字
的顺序将不起作用(所有仅包含字母的标识符都将作为关键字使用)。通常,关键字将被显式指定,后跟catchall规则,例如
标识符
规则;这意味着任何未明确命名为关键字的
字母+
都是标识符。我现在明白了。问题是,我试图定义一种语法,允许定义额外的关键字(关键字基本上是函数名),所以我试图只在lexer中定义语法,在解析器中定义语义。因此,它归结为经典关键字与标识符的问题。这已经讨论过好几次了。使用您喜欢的搜索引擎寻找可能的解决方案(包括ANTLR邮件列表中的my)。函数名实际上不是关键字(从语法角度)。它们是在语法分析器规则中表示函数名的结构上可识别的标识符。类似地,变量是标识符,但在它们自己的解析器规则中定义的不同结构关系中出现。生成的解析树为区分标识符类型提供了一个明确的(且易于使用的)基础。