[英]How to handle negative integer in ANTLR4 grammar targetting C++
我正在制作一个目标为 C++ 的 ANTLR4 计算器,我正在尝试使用下面的 g4 代码处理 integer (...-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 : '+';
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.