【发布时间】:2014-02-18 17:55:14
【问题描述】:
我正在解析一些结构模糊的输入,例如 C-ish 代码。像这样:
Name0
{
Name1
{
//A COMMENT!!
Param0 *= 2
Param2 = "lol"
}
}
其中一部分是 cmets,我想完全忽略它(它不起作用)。我认为有两件事是node,命名范围(category 规则)如Name0 {} 和值(param 规则)如Param0 *= 2...然后是comment。我试过这样设置:
typedef boost::variant<boost::recursive_wrapper<Category>, Param> Node;
qi::rule<Iterator, Node(), ascii::space_type> node;
所以node 规则将Category 或Param 放入variant。以下是其他规则(我省略了一些与此无关的规则):
qi::rule<Iterator> comment; //comment has no return type
qi::rule<Iterator, Category(), ascii::space_type> category;
qi::rule<Iterator, Param(), ascii::space_type> param;
以及他们的实际代码:
comment = "//" >> *(char_ - eol);
param %=
tagstring
>> operators
>> value;
category %=
tagstring
>> '{'
>> *node
> '}';
node %= comment | category | param;
comment 设置为使用= 而不是%=,并且它没有返回类型。但是,无论它们出现在哪里,cmets 最终都会在我的输出 Nodes 中创建空的 Categorys。我尝试将comment 移出node 规则并进入category,如下所示:
category %=
tagstring
>> '{'
>> *(comment | node)
> '}';
还有其他各种东西,但那些空条目不断弹出。我不得不让comment 输出一个字符串并将std::string 放入我的Node variant 只是为了抓住它们,但这会破坏我在规则的其他部分中坚持评论的能力(除非我真的抓住了每个位置的字符串)。
我怎样才能完全忽略 comment 并让它不以任何方式显示在任何输出中?
编辑:您认为omit 会这样做,但似乎没有改变任何东西......
编辑 2:引用 this SO answer,我有一个不稳定的解决方案:
node %= category | param;
category %=
tagstring
>> '{'
>> *comment >> *(node >> *comment)
> '}';
但是,我想尝试将 cmets 插入各种位置(在 tagstring 和 { 之间,在我未显示的 root 规则中,根 categorys 之间等)。还有比这更简单的方法吗?我希望可以通过将简单的>> commentwrapper 插入到我想要的任何位置来完成...
【问题讨论】:
-
船长是要走的路。请以这个问题为例:stackoverflow.com/questions/21672316/…
-
@MikeM 感谢您的链接!解决了我的问题,并在我的回答中准确概述了问题。
标签: c++ parsing boost boost-spirit boost-spirit-qi