我想建立中缀计算器。我选择的方法是在树中解析输入,其中节点中的运算符和叶子中的操作数,然后从下到上遍历树(从高优先级运算符到下层)。
树的例子:
(12 + 8) / 2 - 5
–
/ \
'/' 5
/ \
+ 2
/ \
12 8
首先:我是Java的新手,我应该选择什么样的数据结构,或者我需要用自己的树实现来创建新类?
第二:处理括号优先级的最佳方法是什么?
答案 0 :(得分:5)
您应该使用将Operand
子类化为Operation
和Literal
的小类层次结构。 Operation
有一个字段用于运算符(最佳:枚举)和两个Operand
字段。
解析器可以创建Operation
和Literal
个对象,并将其引用存储到包含Operation
的内容中。
括号消失,因为生成的树(如Q中所示)将根据优先级进行组织:按括号分组,然后按操作员优先级分组,最后从左到右分组。
你可以写一个简单的递归下降解析器,不需要为这个小小的学术练习设置antlr。
稍后以下是算术表达式的简单语法的BNF:
<expression> ::= <term> | <term> <addop> <expression>
<term> ::= <factor> | <term> <mulop> <factor>
<factor> ::= <constant> | (" <expression> ")"
<constant> ::= <digit> | <digit> <constant>
<addop> ::= "+" | "-"
<mulop> ::= "*" | "/"
<digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
递归下降解析器包括通过查找终端(括号,运算符,数字)并根据备选方案之一组成非终端来解析非终端的方法。成功时,将返回Literal
或Operation
对象,并将其合并到调用者组成的对象中。