假设我已经编写了一个函数来评估一个简单的数学运算,并且我在字符串中有一些用户输入,例如: “1 + [2 + [3 + 4]]” 如何解析这些方括号并首先提取最内层文本(3 + 4),对其进行求值,然后解析外括号(2 + 7)? 我对正则表达式搜索和替换有基本的了解,但我知道他们不会像这样做递归。 我想要一些基本的java代码来做这件事,如果我能避免的话,还不是另一个jar / API。
答案 0 :(得分:10)
实现目标的最简洁方法是为此目的编写Lexer和Parser。对于算术表达式,从头开始编写recursive descent parser并不难。
网上有很多代码示例。 This is an example你可以用它作灵感。
Lexer可以将您的输入规范化并将其抽象为令牌流。这样,您的Parser只需要处理令牌,而不必另外处理空白问题和其他恼人的事情。
Two examples用于基于堆栈的高级算法,another example显示递归下降方法。
答案 1 :(得分:3)
使用堆栈。遇到打开的括号时,将正在处理的任何内容推送到堆栈并启动新表达式。当您点击右括号时,弹出堆栈并使用您刚刚计算的表达式作为下一个项目。或者,正如之前的海报所说,使用递归或树。
答案 2 :(得分:2)
我认为正则表达式不是实现此功能的好选择
您应该将用户表达式转换为postfix或前缀表示法,然后从中构建表达式树。 这是CS中的一种标准方法(语言并不重要),以清洁的方式解决这个问题
答案 3 :(得分:0)
递归适用于这些:
int parse(String expression){
//use a regex to find an instance of [ followed by numbers/operators, followed by ]
//replace it with parse(whatever's inside the brackets)
//continue until there are none left
//evaluate the string (which should be a sequence of numbers and operators without brackets)
}
答案 4 :(得分:0)
对于Java,您可以将JavaCC用于解析器/词法分析器。我在很多项目中都使用过这个。它非常易于使用。我认为其中一个例子包括算术解析。 JavaCC将构建您可以在其中完成的语法树。
使用JavaCC尝试算法可以很好地介绍Context Free Grammar和Abstract Syntax Tree的概念。如果你正在学习,那么在尝试了@emboss建议的
之后,这是一个很好的步骤