我有一个类似Scheme的树 graph 结构。我想用C解析它到一些内存中表示并遍历它。
解析器的任何库或前端都可以这样做吗?
编辑:
我已经解析了以下表达式
true && (false || true) ;
true ;
false || false
进入以下(这是我的类似方案的树转储)
(PROG [(AndExp TVal(OrExp FValTVal)), TVal, (OrExp FValFVal)])
我想用C遍历(我必须把它交给其他只使用C的人)。 PROG是一个标签; AndExp,OrExp等是&&,||的标记等等。
答案 0 :(得分:1)
我想我已理解你的要求,但不太确定。
你有前缀表示法中的表达式,因此这基本上是在二叉树中的转储文件中加载前缀表达式。
这是一个伪代码,描述了将表达式加载到树中的过程。
tree_node make_tree (string dump) { tok1 = get_tok (dump); tok2 = get_tok (dump); tok3 = get_tok (dump); if (tok1 == operand) { node = make_new_node_with (tok1); return node; } node = make_new_node_with (tok1); node->left = make_tree (tok2); node->right = make_tree (tok3); return node; }
使用(AndExp TVal(OrExp FValTVal))
tok1 = AndExp
创建一个新的node1
tok2 = TVal
tok3 = (OrExp FValTVal)
使用TVal
递归调用2 将node2返回到调用1 ,它将它与node1的左指针链接。
递归与来自通话1的(OrExp FValTVal)
通话3 。
tok1 = ORExp
创建一个新的node3
tok2 = FVal
tok3 = TVal
使用FVal
递归调用3 ,使用TVal
调用4 分别使用操作数值返回node4和node5,这是链接到来自call3的node3的左右链接。
不再考虑子表达式,递归返回起点。你有树的根。
( node1 )
|AndExp |
+---+---+
|
+------------+------------+
| |
( node2 ) ( node3 )
| TVal | | ORExp |
+---+---+ +---+---+
|
+-----------+-----------+
| |
( node4 ) ( node5 )
| FVal | | TVal |
+---+---+ +---+---+
如果有两个以上的操作数,则可以通过向树节点添加其他链接来类似地进行处理。
对于转储文件中的每个表达式,由逗号分隔的表达式将具有单独的树,可以遍历这些树。
答案 1 :(得分:1)
这似乎是S-Expression的一种形式。也许This S-Expression Parser可以根据您的需要进行修改。