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

时间:2010-10-26 21:26:59

标签: 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( "\\}" );

但是甚至没有编译。有什么想法吗?

1 个答案:

答案 0 :(得分: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_("\\{}");

即。

  • 文字Text{,后跟内容后跟}

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

  • escChar 是一个转发\\{}

注意, escChar 规则现在返回单个字符并丢弃转义\\。我不确定这是否是你需要的。此外,我删除了内容 escChar 规则的队列,这允许不使用lexeme[](没有队列的规则就像隐式词法一样)。