Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解析嵌套表达式的java方法_Java_Parsing - Fatal编程技术网

解析嵌套表达式的java方法

解析嵌套表达式的java方法,java,parsing,Java,Parsing,假设我编写了一个函数来计算一个简单的数学运算,并且我在字符串中有一些用户输入,例如: "1 + [2 + [3+4]]" 如何解析这些方括号并首先提取最里面的文本(3+4),对其求值,然后解析最外面的大括号(2+7)? 我对正则表达式搜索和替换有初步的了解,但我知道它们不会这样做递归。 我想要一些基本的java代码来实现这一点,如果可以避免的话,不要再使用另一个jar/API。我认为正则表达式不是实现这一功能的好选择 您应该将用户表达式转换为后缀或前缀符号,然后根据它们构建表达式树。 这是CS中

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

我认为正则表达式不是实现这一功能的好选择

您应该将用户表达式转换为后缀或前缀符号,然后根据它们构建表达式树。
这是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)
}

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

实现目标最干净的方法就是为此编写一个Lexer和一个解析器。对于算术表达式来说,从零开始写一篇文章并不难

网上有许多代码示例。你可以用它来获得灵感

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

对于基于堆栈的高级算法,它显示了递归下降方法。

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

使用JavaCC尝试算法可以很好地介绍上下文无关语法和抽象语法树的概念。如果您正在学习,那么在尝试@emboss建议的相关内容后,这是一个很好的步骤: