我正在使用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规则现在返回单个字符并丢弃转义的\\。我不确定这是否是您所需要的。另外,我为内容和escChar规则删除了 skipper ,该 skipper 允许省略lexeme[](没有 skipper 的规则的行为类似于隐式词素)。

    关于c++ - 用boost spirit 解析转义的字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4028169/

    10-15 04:44