我尝试构建一个非常简单的计算器,支持 x,y,+,-,*,/(,)。这个想法很简单:
- 从输入字符串构建语法树(可能是:“x+3y”)
- 对于给定的 x,y,通过解析语法树并为 x 和 y 插入整数来计算结果。
使用 boost 1.46,您可以使用 parse_phrase() 轻松地同时完成这两个步骤。但是,我必须执行步骤 2 一百万次,而解析不会改变。所以我想把它分开(就像经典精神版本中常见的那样)。我怎样才能做到这一点?(请注意:boost 1.46 还没有 utree 数据结构)
我尝试构建一个非常简单的计算器,支持 x,y,+,-,*,/(,)。这个想法很简单:
使用 boost 1.46,您可以使用 parse_phrase() 轻松地同时完成这两个步骤。但是,我必须执行步骤 2 一百万次,而解析不会改变。所以我想把它分开(就像经典精神版本中常见的那样)。我怎样才能做到这一点?(请注意:boost 1.46 还没有 utree 数据结构)
与此同时,我得到了解决方案。这很简单,请查看此处链接的 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 是全功能的替代品。