【问题标题】:Boost Spirit Qi - Efficient Quote GrammarBoost Spirit Qi - 高效引文语法
【发布时间】:2014-07-11 22:21:14
【问题描述】:

我正在尝试在我的 boost spirit qi 语法中实现一个规则,该规则的行为类似于 Lisp 语言中的 QUOTE。

类似:QUOTE(a b c)

这个想法是,QUOTE 的左括号和右括号之间的任何内容都将被捕获到字符串文字中,而不是被进一步解析。

由于 '(' 或 ')' 字符可能出现在 QUOTE 中, 我不能使用:'\"' >> *~char_('\"') >> '\"' 而是需要跟踪括号以确定引号的结尾。

例如:QUOTE(a ( b c ) d) 在这里,我想将内容 "a ( b c ) d" 解析为字符串文字。

我可以想到几种方法来做到这一点,一般的想法是保留一个局部变量来增加/减少括号深度等。

由于语义操作效率低下,我希望有人可以评论解决此问题的有效方法。

谢谢!

【问题讨论】:

  • 语义操作如何低效?它们在编译时可能很麻烦而且很慢。但它们通常也非常有效。 (如果不是,通常是语法)。但是see here 表示语义操作的一些缺点

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


【解决方案1】:

这里有qi::raw[]

它公开了源迭代器范围,因此您可以决定从中复制或构造,例如 boost::string_ref。没有比这更有效的了。

例如:

qi::rule<It, std::string()> demo =
      qi::raw [
          qi::int_ >> '{' >> (qi::double_ % ',') >> '}'
      ];

【讨论】:

  • 谢谢,这以非常直接的方式解决了我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多