我尝试解析类似Lisp/Scheme的简单代码
E.g. (func a (b c d) )
并从中构建一棵树,
我可以在C中完成解析,而不使用(即仅使用flex
返回记号,并使用递归构建树)。
但是,对于bison
的语法,我不确定在哪里添加代码来构建列表(即与累积终端符号相关联的规则以及将构建的列表链接到父节点的位置)。
我的语法类似于这里的语法: Lisp grammar in yacc 该语法是正确的,并且可以识别代码。
我尝试解析类似Lisp/Scheme的简单代码
E.g. (func a (b c d) )
并从中构建一棵树,
我可以在C中完成解析,而不使用(即仅使用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");}
;
flex
改为gnu-flex
,尽管这里有反对意见:http://meta.stackexchange.com/questions/26460/tag-for-two-flexes/26708#26708,但这是因为在标签上看到Adobe图标会让许多访问者感到困惑。希望这个问题能够很快得到解决。祝你好运,希望你的问题能够得到答案。 - mechanical_meat#e#x+e#s+e @ -e#l-e
。 - Eli Barzilay