我正在尝试创建一个同样支持负数的计算器,并最终创建一个lisp风格的树。
我这样定义词法分析器规则:
INT :'-'? [0-9]+ ;
LBRACKET : '(';
RBRACKET : ')';
MULTIPLICATION : '*' ;
DIVISION: '/' ;
PLUS: '+' ;
MINUS: '-' ;我对每个操作都有一个规则,例如:
e13=exp MINUS e14=exp{
SPTree tempTree= new SPTree("-");
tempTree.insertChild($e13.tree);
tempTree.insertChild($e14.tree);
$tree=tempTree;
} 但是当我尝试输入表达式:2-3时,出现的lisp树是(2)。
为什么它忽略了-3
发布于 2015-12-26 22:34:32
您不应将INT定义为支持负数。把它留给减法运算符。
现在,输入如下:
2-3将像这样标记化:2 -3,即:INT INT。而且你也没有定义一个能够处理这个问题的解析器规则。
如果从INT定义中删除该'-'?,您将获得预期结果:
2 - 3,也就是INT MINUS INT,这是可解析的。
因此,只需定义以下内容:
INT : [0-9]+ ;此外,您应该将所需的EOF添加到根解析器规则,以便解析器在意外的额外输入时生成错误。
请参阅my answer here获取一个简单的实用数学示例。
发布于 2019-01-24 20:10:28
您可以使用否定表达式,而不是否定数。例如:
additiveExpr
: multExpr (('+' |'-' ) multExpr )*;
multExpr
: negationExpr (('*' |'/' ) negationExpr )*;
negationExpr
: ('-')? primary;
primary
: atom
| '(' orExpr ')'; https://stackoverflow.com/questions/34368305
复制相似问题