布尔语法的递归下降解析

时间:2015-09-18 00:02:43

标签: java parsing recursion

我试图通过示例学习编译器和递归下降解析。这不是家庭作业。我已经尝试过查看其他一些答案,但我很难理解它们。

我正在使用的示例是一个布尔表达式解析器,它返回表达式有效且无效的区域。

有效语法是空格,括号,AND,OR和小写字。小写单词需要用布尔运算符(即cat和mouse)分隔。

一些如何运作的例子:

"cat AND mouse" = "cat <v>AND</v> mouse"
"cat AND mouse OR" = "cat <v>AND</v> mouse <i>OR</i>"
"pet OR ((domestic AND cat)" = "pet <v>OR</v> <i>(</i><v>(</v>domestic <v>AND</v> cat <v>)</v>"
"cat food" = "cat <i>?</i> food"

正如您所看到的,我想要输出的是每个括号和布尔运算符是否有效,方法是用“v”标记包围有效或“i”标记为无效。

我相信语言的语法看起来像这样(如果我错了,请纠正我):

Expression -> 1 or more clauses
Clause -> lowercase_term | (lowercase_term bool_op lowercase_term)
Lowercase_Term -> 1 or more letters from [a-z]
Bool_Op -> AND | OR

但是,我不太确定如何从中创建递归下降解析器。我假设它需要是某种树,但只是不确定。

作为参考,我在Java中这样做,但是非常感谢伪代码或任何能帮助我理解这一点的语言代码!

2 个答案:

答案 0 :(得分:0)

看看How To Build A Boolean Expression Evaluator - Using a recursive descent parser and the interpreter pattern。这看起来非常像你要求的东西。

关于检测输入的“有效”与“无效”部分:一个简单的方法是:首先尝试解析整个文本。如果这有效,则全文有效。否则,将文本解析为倒数第二个字符等,直到最终找到有效输入的前缀。之后的所有文字都是“无效的”。

答案 1 :(得分:0)

在这里你可以阅读并尝试这些例子,我在那里解释了如何使用递归下降解析技术解析和解释算术表达式:

https://leanpub.com/pic/read#leanpub-auto-chapter-2---parsing-and-calculating-expressions

递归下降解析是最直观的解析技术。编写自己的手工编码解释器非常合适,不仅包含算术表达式,还包含循环,if-else语句等。

这是我使用递归下降解析技术编写的手工编码玩具解释器:

https://github.com/mehmetcoskun/contra

它是开源的,你可以下载和调整。