gpt4 book ai didi

c++ - boost::spirit 和生成不同的节点

转载 作者:搜寻专家 更新时间:2023-10-31 01:23:20 24 4
gpt4 key购买 nike

问候。

我一直对如何在解析语法和生成 AST 时强制 boost::spirit 生成不同类的节点感兴趣。比如,我想要不同的节点,例如 VariableNode(其成员为变量名)、ValueNode(其成员为 value)等。

在处理 tree-walker 时它会非常有用。在这种情况下,我们将编写一个基础抽象类来遍历所有不同的节点(应用“访问者”模式)并在处理语义检查阶段、代码生成阶段等时扩展它。

boost::spirit 允许我们参数化用于树的工厂,但我一直无法找到调整其行为的合适方法。

任何想法,代码?提前致谢。

最佳答案

我不确定我是否理解您的问题,您的意思是这样吗? :

typedef boost::variant<VariableNode, ValueNode> AbstractNode;

template <typename Iterator>
struct NodeGrammar: public boost::spirit::qi::grammar<Iterator, AbstractNode(), boost::spirit::ascii::space_type>
{
NodeGrammar: NodeGrammar::base_type(start)
{
start %= variableNode | valueNode >> eps;

variableNode %= /*something*/;
valueNode %= /*something*/;
}

//start
boost::spirit::qi::rule<Iterator, AbstractNode(), boost::spirit::ascii::space_type> start;

boost::spirit::qi::rule<Iterator, VariableNode(), boost::spirit::ascii::space_type> variableNode;
boost::spirit::qi::rule<Iterator, ValueNode(), boost::spirit::ascii::space_type> valueNode;
};

然后您可以将 boost::apply_visitor(请参阅 boost::variant 文档)与访问者类一起使用来执行您想要的行为。

关于c++ - boost::spirit 和生成不同的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1611615/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com