如果我有一个字符串如下
((a || b)&& c)|| (d& e)
如何根据括号将它们拆分成不同的字符串并形成一个像这样的树?
( (a || b) && c) || (d && e) ---> Root
/ \
/ \
( (a|| b) || c) (d && e)
/ \ / \
/ \ / \
(a || b) c d e
答案 0 :(得分:1)
答案 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>