用于解析嵌套表达式的java方法

假设我已经编写了一个函数来评估一个简单的数学运算,并且我在字符串中有一些用户输入,例如:“1 + [2 + [3 + 4]]”如何解析这些方括号并首先提取最里面的文本(3 + 4),评估它,然后解析外括号(2 + 7)? 我对正则表达式搜索和替换有基本的了解,但我知道他们不会像这样做递归。 我想要一些基本的java代码来做到这一点,如果我可以避免它,还不是另一个jar / API。

实现目标的最简洁方法是为此目的编写Lexer和Parser。 编写递归下降解析器对于算术表达式来说从头开始并不难。

网上有很多代码示例。 这是一个可以用于灵感的例子 。

Lexer用于规范化您的输入并将其抽象为令牌流。 这样,您的Parser只需要处理令牌,而不必另外处理空白问题和其他恼人的事情。

基于堆栈的高级算法的两个 示例 , 另一个示出递归下降方法的示例 。

使用堆栈。 当您遇到一个打开的括号时,将您正在处理的任何内容推送到堆栈并启动新表达式。 当你点击一个右括号时,弹出堆栈并使用你刚刚计算的表达式作为下一个项目。 或者,正如之前的海报所说,使用递归或树。

我认为正则表达式不是实现此function的好选择

您应该将用户表达式转换为postfix或前缀表示法,然后从中构建表达式树。 这是CS中的标准方法(语言在这里并不重要)以干净的方式解决这个问题

递归适用于这些:

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) } 

对于Java,您可以将JavaCC用于解析器/词法分析器。 我在很多项目中都使用过这个。 它很容易使用。 我认为其中一个例子包括算术解析。 JavaCC将构建您可以在其中完成的语法树。

使用JavaCC尝试算法将为Context Free Grammar和Abstract Syntax Tree的概念提供良好的介绍。 如果你正在学习,那么在尝试了@emboss建议之后,这是一个很好的步骤