【发布时间】:2015-11-05 19:51:24
【问题描述】:
我正在尝试通过示例学习编译器和递归下降解析。这不是家庭作业。我尝试查看其他一些答案,但无法理解它们。
我使用的示例是一个布尔表达式解析器,它返回表达式有效和无效的区域。
有效的语法是空格、括号、AND、OR 和小写单词。小写单词需要用布尔运算符分隔(即 cat AND 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 中执行此操作,但非常感谢伪代码或任何有助于我理解的语言代码!
【问题讨论】:
-
您可能希望在解析器前面放置一个词法分析器(lexer)。这将吐出诸如“cat”、“AND”、“mouse”之类的整个标记,而不必单独解析每个字符('c'、'a'、't')。