Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.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_Tree - Fatal编程技术网

Java 如何用字符串组成树

Java 如何用字符串组成树,java,tree,Java,Tree,如果我有一个字符串如下 (a | | b |和c | | | | | | | d和e | | 我如何根据括号将它们分割成不同的字符串,并形成这样的树 ( (a || b) && c) || (d && e) ---> Root / \ / \ ( (a|| b) || c) (d &a

如果我有一个字符串如下

(a | | b |和c | | | | | | | d和e | |

我如何根据括号将它们分割成不同的字符串,并形成这样的树

         ( (a || b) && c) || (d && e)  ---> Root

               /                \
              /                  \
           ( (a|| b) || c)      (d && e)
           /           \             /  \             
          /             \            /   \
         (a || b)        c           d    e

您将需要一个解析树生成器。对于繁重的许多用途,但对于简单的语法,我在JavaCC和

方面取得了很好的成功。您提出的问题可能属于计算机科学的解析器和形式语言分支

可以使用lex&yacc等工具生成基于任意字符串的任意语法的解析器程序

Lex是一个词法分析器程序生成工具,它将一个文本文件作为输入,该文本文件将语法的词法规则定义为regexp,并输出一个程序,该程序能够根据规则中定义的任意输入字符串识别标记

Yacc是一个语法分析器程序生成工具,它以lexer作为输入,lexer是一个表示语言语法的文本文件(在您的情况下,它将是一个类似于语法的表达式),并输出一个名为parser的程序,该程序将能够将您的表达式字符串转换为您提到的树(即,将字符串解析为解析树)

Yacc和lex可以很容易地结合使用,生成一个解析器程序,该程序基于所谓的语义操作创建一个解析树,您可以通过该操作指示解析器以您想要的方式构建树

我建议您将以下内容作为介绍性阅读:

如果您对这件事感兴趣,更具挑战性的阅读方式是:

Yacc和Lex仅针对C语言,Java中存在等效的工具。
我最喜欢的java解析器生成器工具是:

我将对问题的另一部分进行评论

…然后形成一棵这样的树

如果你真的想把它打印成输出,你会发现这很棘手

当您进一步了解解析时,您会发现您正在操作一个堆栈,该堆栈包含以前读取但尚未处理的输入标记的值。如果使用递归机制,该堆栈将是隐式的;如果使用迭代方法并自己管理该堆栈,则该堆栈可能是显式的。对于简单的运算符优先解析器,后者将是一种常见的实现

因此,我建议您创建一个
StringBuilder
s的列表。这与堆栈平行。也就是说,
stringBuilderList.get(3)
将与
yourStack.get(3)
等相关联

现在,当您执行一些操作(例如将
(a)
减少到
a
)时,您将向与当前堆栈级别相对应的
stringBuilderList
项追加一个合适的字符串


现在,在您开始关注之前,对您的报价的另一种解释是,输入应该以标准的方式进行智能分析,括号中的项目是先处理的,等等。我建议您对您的需求进行一些澄清。

“那样”不是一个有效的标准。至少您应该给出详细的说明解释如何拆分字符串。到目前为止您尝试了什么?扭曲的树让位于开销较低的树,在什么方向看不到某些叶子的术语。要处理您描述的任意嵌套的运算符和括号是非常重要的。您将需要一个解析器。不难编写,但不是真正可以做到的想在Main()中爆炸吗?…您需要担心
|
&&
的优先级吗?调车场wiki说,“调车场算法后来被推广到操作员优先级解析中。”我会跳过它直接去OPP。我从来没有使用过这些。顺便说一句,输入语言需要有多复杂才能使学习和使用它们变得有价值?@TonyEnnis在我15年的职业生涯中,我只需要写3次解析器。在大多数情况下,我直接用我选择的编程语言(C++或Java)实现它们但结果证明它们很脆弱。上次我花了4个小时学习JavaCC,并对生成的解析器的灵活性感到满意。我的语法只比OP的语法稍微复杂一点。谢谢你提供的信息。我会去看看。