【发布时间】:2011-03-09 23:22:20
【问题描述】:
我试图解析简单的类似 Lisp/scheme 的代码
E.g. (func a (b c d) )
并从中构建一棵树,
我可以在 C 中进行解析,而不使用 bison(即,仅使用
flex 返回令牌并使用递归构建树)。
但是,使用bison 语法,我不确定在哪里添加代码
构建列表(即将哪个规则与累积终端关联
符号以及将构建列表链接到父节点的位置)。
我的语法和这里的类似: Lisp grammar in yacc 语法正确,能识别代码。
【问题讨论】:
-
我从
flex重新标记为gnu-flex,尽管这里有反建议:meta.stackexchange.com/questions/26460/tag-for-two-flexes/… 仅仅是因为网站的许多访问者看到标签上的 Adobe 图标会感到困惑。希望这会很快得到解决。祝您问题得到解答。 -
你几乎不需要 flex 或 bison 来解析简单的 S 表达式。您应该能够将其编码为一个简单的递归下降解析器,其中包含一个用于原子、括号的手动词法分析器和一个类似于 100 行或更少的 C 代码的空白跳过器。最初的 LISP 解释器确实只用了一点点代码就做到了。
-
Ira:确实不需要解析器,但“手动词法分析器”仅适用于人们通常最终得到的常见玩具子集。一些 Lisps/Schemes 的标记可能会非常多毛。为了您的娱乐,下面是Racket 中有效数字常量的示例:
#e#x+e#s+e@-e#l-e。 -
@Ira:是的,我可以用纯 C 编写解析器(我在问题中提到了这一点)。但我想知道 real 解析器是如何从 flex/bison 构建的。
-
@Eli Barzley:也许你需要一个词法分析器来实现像 Racket 这样完整的现代 lisp。 OP 说,“简单”。
标签: parsing lisp bison flex-lexer s-expression