使用C遍历类似方案的树(图)转储

时间:2011-09-07 14:08:15

标签: c tree in-memory-database

我有一个类似Scheme的树 graph 结构。我想用C解析它到一些内存中表示并遍历它。

解析器的任何库或前端都可以这样做吗?

编辑:

我已经解析了以下表达式

true && (false || true) ;
true ;
false || false 

进入以下(这是我的类似方案的树转储)

(PROG [(AndExp TVal(OrExp FValTVal)), TVal, (OrExp FValFVal)])

我想用C遍历(我必须把它交给其他只使用C的人)。 PROG是一个标签; AndExp,OrExp等是&&,||的标记等等。

2 个答案:

答案 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))

    递归调用1

    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可以根据您的需要进行修改。