如何在以C++为目标的ANTLR4语法中处理负整数



我正在制作一个以C为目标的ANTLR4计算器++我正试图用下面的g4代码处理整数(…-1,0,1,…(。

INT :'-'? [0-9]+ ;

这是基于正则表达式

[-]?[0-9]+

但是这个接受-0的情况我如何处理修改代码以摆脱这种负零的情况?

是否存在对"-0"的其他(有效(解释?

如果负0是理解"-0"的唯一方法,但您希望它被视为无效,则保持规则不变,并在语义验证期间检查您自己的代码。你将能够给出一个很好的特定错误消息,而如果你将其从Lexer规则中排除,你将在标记化阶段遇到错误,或者以直接从ANTLR生成相当模糊的语法错误的方式对输入进行标记化。

一般来说,考虑您的Lexer/Parser目标是以"理解该输入的唯一合理方式"来解释您的输入(即使它在您的语言中可能是无效的用法(。将"所有可能的规则"编码到语法中似乎是一种常见的诱惑。这不一定对你有好处。

您可能需要考虑在词汇规则中不包含否定。我想您会发现,通过将否定视为前缀操作(或简单操作(,它将在以后简化解析器。例如,考虑如何处理以下表达式:

2 + 1 - -1

你可能会发现你的lexer试图抓住第一个减号作为INT.的开始

所以。我很想做这样的事情:

expression : POS_INT #literal_expr
| MINUS expression #negate_expr
| expression addOp expression #add_expr
;
addOp : PLUS | MINUS;
POS_INT : [0-9]+;
MINUS : '-';
PLUS : '+';

最新更新