【问题标题】:Parsing escaped strings with boost spirit用增强精神解析转义的字符串
【发布时间】:2011-05-01 00:01:10
【问题描述】:

我正在使用 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( "\\}" );

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

【问题讨论】:

  • 编译器错误(以及它所在的行)会有所帮助。

标签: c++ boost boost-spirit boost-spirit-qi


【解决方案1】:

你的语法可以写成:

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

  • textText{ 后跟 content 后跟 }

  • content 至少是 一个字符(但没有})或 一个escChar

  • escChar 是单个转义的\\{}

注意,escChar 规则现在返回单个字符并丢弃转义的\\。我不确定这是否是您需要的。此外,我删除了 contentescChar 规则的船长,这允许省略 lexeme[](没有船长的规则就像一个隐含的词位)。

【讨论】:

  • 您好,hkaiser,感谢您的帮助。我已经尝试过您的解决方案,但无法解析: Text{ \} };我认为这是因为解析器 ~char_('}') 与反斜杠匹配,但我尝试了以下但没有成功: content = +( ~char_( "\\\\}" ) | escChar );。有什么想法吗?
  • 是的,没错。 ~char_('}') 确实匹配反斜杠。我很抱歉这个疏忽。如果您将其更改为 ~char_("\\}") 它不应该再这样做了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多