我想使用 Boost Spirit 将文件解析为 AST。
我的 AST 的根源是一个只有一个属性的类:
typedef boost::variant<FunctionDeclaration, GlobalVariableDeclaration> FirstLevelBlock;
struct Program {
std::vector<FirstLevelBlock> blocks;
};
BOOST_FUSION_ADAPT_STRUCT(
::Program,
(std::vector<eddic::FirstLevelBlock>, blocks)
)
如果我使用单个规则进行解析:
program %= *(function | globalDeclaration);
它无法编译,但如果我将单个字符串名称添加到 Program 中,它就可以正常工作。我可以使用向量作为根,但我想使用该类,因为我想向 Program 类添加一些方法。
EDIT :
如果我用大括号括住我的程序,它会很好地工作:
program %= lexer.left_brace >> *(function | globalDeclaration) >> lexer.right_brace;
编译并工作正常,但是:
program %= *(function | globalDeclaration);
不编译...
Boost Spirit 中有什么东西可以阻止使用如此简单的规则吗?
编辑的问题版本2 https://stackoverflow.com/revisions/7947180/2
如果我用大括号括住我的程序,它会很好地工作[...],但是program %= *(function | globalDeclaration);
不编译...
Boost Spirit 中有什么东西可以阻止使用如此简单的规则吗?
首先,如果没有定义,我们就无法真正判断function
and globalDeclaration
.
其次,我尝试将我的 PoC 线路更改为
static const qi::rule<It, Program(), space_type> program = *(function | global);
Program d = test("void test(); int abc; int xyz; void last();" , program);
你瞧,我得到了你的编译器错误!现在我当然同意这看起来非常就像属性转换错误一样。另外,这是一个初步的解决方法:
program %= eps >> *(function | global);
如你看到的,qi::eps
来救援
回答原来的问题版本1 https://stackoverflow.com/revisions/7947180/1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)