2015-12-19 38 views
1

我正在尝试创建一个支持负数的计算器,并最终创建一个lisp样式的树。负数支持的ANTLR计算器

我定义了词法规则是这样的:

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

回答

2

您应该不是INT定义为支持负数。把它留给减法操作符。

眼下,下面输入:

2-3 

将被标记化这样的:2-3,那就是:INTINT。而且您没有定义能够处理该问题的解析器规则。

如果丢弃'-'?INT定义,你会得到预期的结果:
2-3,这是INTMINUSINT,那就是可解析。

所以,仅仅定义如下:

INT : [0-9]+ ; 

此外,您应该添加一个需要EOF到根解析器规则,所以解析器会产生意想不到上额外的输入错误。

看到我的回答here为一个简单的工作数学示例。

+0

通过这种方式2 - 3正在工作,但-3 + 2不是。 为什么? 它打印5结果,忽略减号。 – SctALE

+0

@SctALE这应该可以正常工作,您的规则必须有问题(问题中没有解析器规则)。看到我的链接的答案,它工作正常,它不会帮助你,与您的代码一起发布一个新的问题。你可能没有包含一个一元减法则。 –

+0

https://stackoverflow.com/questions/48267834/antlr-parsing-and-code-generation-with-operator-and-number-sign我应该写些什么来帮助理解我的问题吗? – SctALE