简朴的表达式求值
一直很想做个比Windows自带的高级一点的计较器,能将整个表达式输入,然后求值。这个措施要求读者具备编译道理的一些常识。举个实例来说明措施处理惩罚进程。假设要求值的表达式为 :
-25*(56+15)# (个中#号作为表达式竣事符号)。
首先对表达式举办词法阐明,答允呈现的字符为:
{0 ,1, 2 ,3 ,4 ,5 ,6, 7 ,8, 9 . ,+ ,-, *, / ,( ,),#}
阐明的功效发生两种范例的单词:操纵符和操纵数。
操纵符包罗:
{+, - ,* ,/ ,( ,)}
操纵数包罗:
int 和 double 范例。
上面表达式发生的单词序列为:
{-25,*,(,56,+,15,)}。
这些单词的范例也需要生存。
词法阐明正确后将对发生的单词序罗列办语法阐明。
界说E为表达式,N为常数(视为终结符)。表达式的发生式可暗示如下:
E ' N
消除左递归后的发生式(E_为新发生的标记):
E ' (E)
E ' E+E
E ' E-E
E ' E*E
E ' E/E
E->NE_
E->(E)E_
E_->+EE_
E_->-EE_
E_->*EE_
E_->/EE_
E_->NULL (空串)
可以按照这个发生式结构递归的语法阐明器。详细细节就不论述了,可以阅读源代码。
语法阐明正确后就可以求值了,求值时用到一个操纵数仓库和操纵符仓库,以及一个算符优先表(存储了运算符之间的优先干系),详细细节可以阅读源码。
本文配套源码