使用提升精神分离AST创建和计算

时间:2012-04-12 09:17:42

标签: c++ boost syntax tree calculator

我尝试构建一个非常简单的计算器,支持x,y,+, - ,*,/(,)。这个想法很简单:

  1. 从输入字符串构建语法树(可能是:“x + 3y”)
  2. 对于给定的x,y通过解析语法树并为x和y插入int来计算结果。
  3. 使用boost 1.46,您可以使用parse_phrase()轻松地同时执行这两个步骤。但是,我必须执行步骤2一百万次,而解析不会改变。所以我想把它分开(就像在经典精神版本中一样)。我怎样才能做到这一点? (请注意:boost 1.46还没有完整的数据结构)

1 个答案:

答案 0 :(得分:2)

我同时得到了一个解决方案。这很简单,请看the boost docs linked here

main()函数包含以下代码:

expression_ast ast;
ast_print printer;
bool r = phrase_parse(iter, end, calc, space, ast);

if (r && iter == end)
{
    // [...]
    printer(ast);
    // [...]
}

boost中实际上有多个phrase_parse()函数。有一些不同的词组_parse和带有附加参数的词组“变体[s]:解析器的属性。”,如in the boost docs所述。在上面的代码中,ast是解析器的属性; printer然后评估ast。

如果我们想要从外部评估打印机的不同值,我们会在每次调用printer(ast)之前将它们传递给打印机。

1.46的注意事项:还没有boost::utree。但是,此示例中的AST是完全功能的替代。