用提升精神解析逃脱的弦乐

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)

但是甚至没有编译.任何的想法?

hka*_*ser 8

你的语法可以写成:

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[](没有队长的规则就像一个隐含的词法).

  • 嗨,hkaiser,谢谢你的帮助.我已经尝试过您的解决方案,但无法解析此问题:文字{\}}; 我认为这是因为解析器~char_('}')匹配反斜杠,但我尝试了以下但没有成功:content = +(~char_("\\\\}")| escChar);. 任何的想法? (2认同)
  • 是的,对.~char_('}')确实匹配反斜杠.对此疏忽感到抱歉.如果将其更改为~char _("\\}"),则不应再这样做了. (2认同)