Bru*_*uno 5 c++ boost boost-spirit boost-spirit-qi
我正在使用Spirit 2.4,我想要解析这样的结构:
文字{text_field};
关键是text_field是一个带有符号'{','}'和'\'的转义字符串.我想使用qi为此创建一个解析器.我一直在尝试这个:
using boost::spirit::standard::char_;
using boost::spirit::standard::string;
using qi::lexeme;
using qi::lit;
qi::rule< IteratorT, std::string(), ascii::space_type > text;
qi::rule< IteratorT, std::string(), ascii::space_type > content;
qi::rule< IteratorT, std::string(), ascii::space_type > escChar;
text %=
lit( "Text" ) >> '{' >>
content >>
"};"
;
content %= lexeme[ +( +(char_ - ( lit( '\\' ) | '}' ) ) >> escChar ) ];
escChar %= string( "\\\\" )
| string( "\\{" )
| string( "\\}" );
Run Code Online (Sandbox Code Playgroud)
但是甚至没有编译.任何的想法?
你的语法可以写成:
qi::rule< IteratorT, std::string(), ascii::space_type > text;
qi::rule< IteratorT, std::string() > content;
qi::rule< IteratorT, char() > escChar;
text = "Text{" >> content >> "};";
content = +(~char_('}') | escChar);
escChar = '\\' >> char_("\\{}");
Run Code Online (Sandbox Code Playgroud)
即
文本是Text{后面的内容,然后}
content至少是一个字符(但不是})或escChar的一个实例
escChar是单个转义\\,{或}
注意,escChar规则现在返回一个字符并丢弃转义\\.我不确定这是否是你需要的.另外,我删除了内容和escChar规则的队长,这允许放弃lexeme[](没有队长的规则就像一个隐含的词法).