我试图解析简单的 Lisp/scheme-like 代码
E.g. (func a (b c d) )
并从中构建一棵树,我可以在不使用的情况下在 C 中进行解析bison
(即,仅
flex
用于返回标记并使用递归构建树)。但是,对于bison
语法,我不确定在哪里添加代码来构建列表(即,与累积终端符号相关联的规则以及将构建列表链接到父节点的位置)。
我的语法和这里的类似: Lisp grammar in yacc 语法是正确的,可以识别代码。
我试图解析简单的 Lisp/scheme-like 代码
E.g. (func a (b c d) )
并从中构建一棵树,我可以在不使用的情况下在 C 中进行解析bison
(即,仅
flex
用于返回标记并使用递归构建树)。但是,对于bison
语法,我不确定在哪里添加代码来构建列表(即,与累积终端符号相关联的规则以及将构建列表链接到父节点的位置)。
我的语法和这里的类似: Lisp grammar in yacc 语法是正确的,可以识别代码。
您是否尝试过将代码添加到每个原子的当前列表中,以及在处理括号时管理列表树的代码?除非您遇到其他问题,否则这似乎是最简单的方法:
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");}
;
这假设您在每个列表结构中保留一个父点。