我试图解析简单的Lisp / scheme-like代码
E.g. (func a (b c d) )
并从中构建一棵树,
我可以在不使用bison
的情况下在C中进行解析(即仅使用
flex
返回令牌并使用递归构建树)。
但是,使用bison
语法,我不知道在哪里添加代码
构建列表(即,哪个规则将与累积终端相关联
符号以及将构建列表链接到父节点的位置。)
我的语法类似于这里的语法: Lisp grammar in yacc 语法是正确的,可以识别代码。
答案 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");}
;
这假设您在每个列表结构中保留一个父点。