0

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

  1. 从输入字符串构建语法树(可能是:“x+3y”)
  2. 对于给定的 x,y,通过解析语法树并为 x 和 y 插入整数来计算结果。

使用 boost 1.46,您可以使用 parse_phrase() 轻松地同时完成这两个步骤。但是,我必须执行步骤 2 一百万次,而解析不会改变。所以我想把它分开(就像经典精神版本中常见的那样)。我怎样才能做到这一点?(请注意:boost 1.46 还没有 utree 数据结构)

4

1 回答 1

2

与此同时,我得到了解决方案。这很简单,请查看此处链接的 boost 文档

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() 函数。如boost docs 中所述,phrase_parse 的变体没有和“phrase_parse 的变体[s] 带有一个附加参数:解析器的属性。” 。在上面的代码中,ast是解析器的属性;printer然后评估 ast。

如果我们想从外部评估具有不同值的打印机,我们将在每次调用printer(ast).

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

于 2012-08-25T06:25:12.887 回答