繁体   English   中英

如何在 ANTLR4 语法目标 C++ 中处理否定 integer

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM