使用flex / bison构建Lisp / Scheme类似的解析树

时间:2010-06-30 05:51:06

标签: parsing lisp bison flex-lexer s-expression

我试图解析简单的Lisp / scheme-like代码

E.g. (func a (b c d) )

并从中构建一棵树, 我可以在不使用bison的情况下在C中进行解析(即仅使用 flex返回令牌并使用递归构建树)。 但是,使用bison语法,我不知道在哪里添加代码 构建列表(即,哪个规则将与累积终端相关联 符号以及将构建列表链接到父节点的位置。)

我的语法类似于这里的语法: Lisp grammar in yacc 语法是正确的,可以识别代码。

1 个答案:

答案 0 :(得分:3)

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

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");}
    ;

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