【问题标题】:Building Lisp/Scheme-like parse tree with flex/bison使用 flex/bison 构建类似 Lisp/Scheme 的解析树
【发布时间】: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/… 仅仅是因为网站的许多访问者看到标签上的 Adob​​e 图标会感到困惑。希望这会很快得到解决。祝您问题得到解答。
  • 你几乎不需要 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


【解决方案1】:

您是否尝试过将代码添加到每个原子中的当前列表中,以及在处理括号时管理列表树的代码?除非您遇到其他问题,否则这似乎是最简单的方法:

listend: members ')'        { cur = cur->parent; }
       | ')'                { cur = cur->parent; }
       ;

list: '(' listend           { cur = newList(cur);}
    ;

atom: ID                    { appendAtom(cur, "ID"); }
    | NUM                   { appendAtom(cur, "NUM");}
    | STR                   { appendAtom(cur, "STR");}
    ;

这假设您在每个列表结构中都保留了一个父点。

【讨论】:

  • 嗨,Amoss,我没有尝试过使用父指针,将尝试这种方法。谢谢。
  • vjom:有用吗?如果是这样,请接受答案,给予阿莫斯应有的待遇:)
猜你喜欢
  • 2012-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多