灵气:完全无视一些规则的输出
Spirit Qi: Completely ignoring output of some rules
我正在解析一些结构模糊的输入,比如C-ish代码。像这样:
Name0
{
Name1
{
//A COMMENT!!
Param0 *= 2
Param2 = "lol"
}
}
其中一部分是评论,我想完全忽略它(它不起作用)。我认为有两件事是node
,像Name0 {}
这样的命名作用域(category
规则)和像Param0 *= 2
这样的值(param
规则)。。。则存在CCD_ 6。我试过这样设置:
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
被设置为使用=
而不是%=
,并且它没有返回类型。然而,无论注释出现在哪里,它们最终都会在我的输出Node
s中创建空的Category
s。我已经尝试过将comment
从node
规则中移出并进入category
,如下所示:
category %=
tagstring
>> '{'
>> *(comment | node)
> '}';
还有其他各种各样的东西,但那些空条目不断出现。我不得不让comment
输出一个字符串,并将std::string
放在我的Node
variant
中,只是为了对它们进行排序和捕获,但这扰乱了我在规则的其他部分进行注释的能力(除非我真的在每个位置都获取了字符串)。
我怎么能完全忽略comment
,让它不以任何方式出现在任何输出中?
编辑:你可能认为omit
会做到,但似乎没有改变任何事情。。。
编辑2:参考这个SO的答案,我有一个不可靠的解决方案:
node %= category | param;
category %=
tagstring
>> '{'
>> *comment >> *(node >> *comment)
> '}';
然而,我想尝试将注释粘贴到各种位置(在tagstring
和{
之间,在我未显示的root
规则中,在根category
之间,等等)。还有比这更简单的方法吗?我希望只要把一个简单的>> commentwrapper
插到我想插的地方就可以完成。。。
好吧,让自己成为队长也不算太糟。正如Mike M所说,它优雅地解决了这个评论问题。我在一个名为Parser
的结构中定义我的规则,该结构是用Iterator
模板化的。必须做一些调整才能使用队长。首先,这里是在Parser
中定义的队长,以及我的所有其他规则:
typedef qi::rule<Iterator> Skipper;
Skipper skipper;
所以CCD_ 33是CCD_。以下是我的Parser
结构最初的样子,它使用ascii::space_type
类型的ascii::space
规则作为其队长,这与skipper
所基于的qi::rule<Iterator>
类型不同!
struct Parser : qi::grammar<Iterator, std::vector<Category>(), ascii::space_type>
{
qi::rule<Iterator, std::vector<Category>(), ascii::space_type> root;
...
因此,规则模板中ascii::space_type
的每个实例都必须替换为Skipper
!这包括除了这里显示的root
之外的其他规则,例如我的问题中的param
和category
。留下旧ascii::space_type
的任何残余都会产生神秘的编译器错误。
struct Parser : qi::grammar<Iterator, std::vector<Category>(), qi::rule<Iterator>>
{
typedef qi::rule<Iterator> Skipper;
Skipper skipper;
qi::rule<Iterator, std::vector<Category>(), Skipper> root;
...
最初的船长只是space
,我的现在是space
和comment
的替代品。没有丢失旧功能(空间跳过)。
skipper = space | comment;
然后需要从使用ascii::space
:的旧版本调整phrase_parse
调用
bool r = phrase_parse(iter, end, parser, ascii::space, result);
至
bool r = phrase_parse(iter, end, parser, parser.skipper, result);
现在评论就像空白一样容易消失。令人惊叹的
- 递归函数计算序列中的平方和(并输出过程)
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 请解释"函数1(p1,p2,p3);"的输出
- C++:将控制台输出存储在宏中更好吗
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 如何从void函数输出字符串
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- AES加密到解密未正确输出
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- C++格式化输出问题
- 生成文件不对文件使用隐式规则
- 如何阻止Lex为每个规则输出到thevest to stdout
- 灵气:在规则中插入预定义的输出
- 灵气:完全无视一些规则的输出
- GNU Make -在规则/目标中设置shell命令输出中的MAKEFILE变量