2013-05-05 104 views
1

我正在学习龙书,迫不及待地写了一个表达式解析器。解析算术表达式

为了处理负数输入,我的词法分析器在满足符号' - '时读取数字以返回数字标记。

“-4 + 2” 会得到(-4号)(+,运营商)(2号)

但后来我发现,它不能做的事情一样容易“4 2“,因为

(4,数字)(-2,数字) 这是一个错误的语法。

我的解决方案之一是在评估表达式之前进行一些预处理,例如,如果第一个标记是减号,则附加零。 我想知道你们如何处理这种情况?

谢谢。

+1

把它作为'( - ,operator),(4,number),(+ operator),(2,number)'并判断'-'是一元减数还是后面的二进制减法? – 2013-05-05 16:14:42

回答

2

我词法读取时满足符号位“ - ”返回一个负数

不要。一元运算符应该由解析器处理,而不是词法分析器。

我的解决方案之一是在评估表达式之前进行一些预处理,例如,如果第一个标记是减号,则附加零。

编号修复问题。

当你在洞里时,停止挖掘。

+0

伟大的意见!谢谢! – babel92 2013-05-07 20:38:33

3

您应该拥有以下语法,但不能将"-" number转换为令牌。

number := DIGIT+ 

unary := number 
unary := "-" unary 

expr := expr "+" unary 
expr := expr "-" unary 
... 

由于有一元表达式,它不是运算符优先级语法。你应该用更复杂的解析器解析它。

+0

谢谢!这有助于很多! – babel92 2013-05-07 20:37:56

+0

请注意,此语法不完整。它缺少'期限'和'因素'和'主要'。 – EJP 2013-05-07 21:59:32