如何使用String形成树

时间:2013-08-04 13:34:33

标签: java tree

如果我有一个字符串如下

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

如何根据括号将它们拆分成不同的字符串并形成一个像这样的树?

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

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

3 个答案:

答案 0 :(得分:1)

您需要一个解析树生成器。对于繁重的工作,许多人使用ANTLR,但对于简单的语法,我在JavaCC和JJTree

方面取得了很大的成功。

答案 1 :(得分:0)

您建议的问题可能属于计算机科学的解析器和正式语言的分支。

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

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

Yacc是一个语法分析器程序生成工具,它将词法分析器,一个表示语言语法的文本文件(在您的情况下,将是一个类似表达式的语法)作为输入,并输出一个名为<的程序strong> parser ,它可以在你提到的时候将表达式字符串转换为树(即将字符串解析为解析树)。

Yacc和lex可以很容易地一起使用来生成一个解析器程序,该程序根据所谓的语义动作创建一个解析树,用它来指示解析器以这种方式构建树你想要的。

我建议您阅读以下内容: http://epaperpress.com/lexandyacc/

如果您对此事感兴趣,那么更具挑战性的阅读将是: http://www.amazon.com/Compilers-Principles-Techniques-Tools-Edition/dp/0321486811/ref=pd_sim_b_9

Yacc和Lex仅适用于C语言,Java存在等效工具。 我在java中最喜欢的解析器生成器工具是:http://goldparser.org/

答案 2 :(得分:0)

我会对问题的另一部分发表评论,

  

......然后形成一棵树。

如果您真的打算将其打印为输出,您会发现它很棘手。

当您了解有关解析的更多信息时,您会发现您将操作包含先前已读但尚未处理的输入令牌值的堆栈。如果使用递归机制,则堆栈将是隐式的,或者如果您使用迭代方法并自己管理堆栈,则堆栈可能是显式的。对于简单的运算符优先级解析器,后者将是常见的实现。

所以,我的建议是你创建一个StringBuilder的列表。这与堆栈并行。也就是说,stringBuilderList.get(3)会与yourStack.get(3)等相关联。

现在,当您执行某些操作(例如将( a )缩减为a时)时,您可以将合适的字符串附加到与当前堆栈级别对应的stringBuilderList项目。

现在,在您开始关注之前,对您的报价的另一种解释只是输入将以标准方式智能地解析,括号中的项目首先处理,等等。我建议您对要求进行一些澄清。< / p>