【发布时间】:2022-09-28 13:58:22
【问题描述】:
我正在制作一个针对 C++ 的 ANTLR4 计算器 我正在尝试使用下面的 g4 代码处理整数 (...-1,0,1,....)。
INT :\'-\'? [0-9]+ ;
这是基于正则表达式
[-]?[0-9]+
但是这个接受 -0 的情况 如何处理修改代码以摆脱这种负零情况?
我正在制作一个针对 C++ 的 ANTLR4 计算器 我正在尝试使用下面的 g4 代码处理整数 (...-1,0,1,....)。
INT :\'-\'? [0-9]+ ;
这是基于正则表达式
[-]?[0-9]+
但是这个接受 -0 的情况 如何处理修改代码以摆脱这种负零情况?
“-0”是否有另一种(有效的)解释?
如果负 0 是理解“-0”的唯一方法,但您希望它被视为无效,则保持您的规则不变,并在语义验证期间检查您自己的代码。您将能够给出一个很好的特定错误消息,但是,如果您将其从 Lexer 规则中排除,您将在标记化阶段遇到错误,或者以某种方式对输入进行标记化,从而生成一个相当模糊的直接来自 ANTLR 的语法错误。
通常,考虑您的 Lexer/Parser 目标是以“理解该输入的唯一合理方式”来解释您的输入(即使它在您的语言中可能是无效的用法)。将“所有可能的规则”编码到语法中似乎是一种常见的诱惑。这不一定对你有好处。
【讨论】:
您可能要考虑在您的词法规则中不包括否定词。 我想您会发现,通过将否定视为前缀操作(或简单操作),它将在以后简化您的解析器。 例如,考虑如何处理如下表达式:
2 + 1 - -1
您可能会发现您的词法分析器尝试将第一个减号作为 INT 的开始。
所以。我很想做类似的事情:
expression : POS_INT #literal_expr
| MINUS expression #negate_expr
| expression addOp expression #add_expr
;
addOp : PLUS | MINUS;
POS_INT : [0-9]+;
MINUS : '-';
PLUS : '+';
【讨论】: