我正在使用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( "\\}" );
但是甚至不编译。任何想法?
最佳答案
您的语法可以写为:
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_("\\{}");
IE。
Text{
,后跟内容,然后是}
一个字符(但没有
}
)或escChar
\\
,{
或}
注意,escChar规则现在返回单个字符并丢弃转义的
\\
。我不确定这是否是您所需要的。另外,我为内容和escChar规则删除了 skipper ,该 skipper 允许省略lexeme[]
(没有 skipper 的规则的行为类似于隐式词素)。关于c++ - 用boost spirit 解析转义的字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4028169/