2010-10-26 35 views
4

我正在使用Spirit 2.4,我想解析这样的结构:解析带有助推精神的逃脱字符串

Text {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("\\}"); 

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

+0

编译器错误(和它所在的行)将有所帮助。 – 2010-10-26 21:31:08

回答

7

你的语法可以写成:

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_("\\{}"); 

  • 文本之后Text{的内容,然后}

  • 内容至少一个实例 或者是字符(但没有})或 的escChar

  • escChar是一个逃脱\\{,或}

注意,escChar规则现在返回单个字符并丢弃逃跑\\。我不确定这是否是您需要的。此外,我删除了船长的内容escChar规则,该规则允许从lexeme[](没有船长的行为就像一个隐含的词位一样)的规则。

+1

嗨,hkaiser,谢谢你的帮助。我已经尝试了您的解决方案,但未能解析此文本{\}};我认为这是因为解析器〜char_('}')匹配反斜杠,但我尝试了以下没有成功:content = +(〜char_(“\\\\}”)| escChar);.任何想法? – Bruno 2010-10-27 17:19:47

+1

是的,没错。 〜char_('}')确实匹配反斜杠。我很抱歉这个疏忽。如果您将其更改为〜char _(“\\}”),则不应该这样做。 – hkaiser 2010-10-28 01:37:21