11

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

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

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

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

4

1 回答 1

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

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

于 2010-07-08T09:37:37.333 回答