【问题标题】:boost spirit and related parts提振精神及相关零件
【发布时间】:2014-02-13 14:50:12
【问题描述】:

我需要通过增强精神创建一个规则,以匹配诸如

之类的情况
return foo;

return (foo);

我是这样尝试的:

start %= "return" >> -boost::spirit::qi::char_('(') >> identifier >> -boost::spirit::qi::char_(')') >> ';';

但即使在这种情况下也会成功

return (foo;

return foo);

我该如何解决?

【问题讨论】:

  • statement = ("return" >> identifier >> ';') | ("return" >> '(' >> identifier >> ')' >> ';') 呢?
  • @faranwath 是的,我已经考虑过了,但它看起来很糟糕,尤其是当我有很多具有相似结构的规则时
  • 可怕吗?我想我们在使生产规则看起来不错的原因上有所不同,但这是你的工作,很公平。
  • 由于您似乎有许多这些规则,您可以使用相关的解析器(此处为标识符)作为处理括号的解析器的参数。但是,解析器作为解析器的参数存在一些问题,sehe 在 SO 上有一篇不错的帖子,但我无法立即找到它。
  • 另外我需要有相同数量的开括号和右括号,我什至可以在一个表达式中有两个或更多括号对

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


【解决方案1】:

您的示例看起来很病态,因为您使用的示例过于具体。

实际上,您不会"return" >> identifier;。通常,返回的东西只是一个表达式。所以,你会说

expr = literal | variable | function_call;

现在,一举解决带括号的表达式的一般方法很简单:

expr = literal | variable | function_call
     | ('(' >> expr >> ')')
     ;

巴姆。完毕。它处理平衡。它处理嵌套括号。它甚至可以处理(((foo)))。那天没有哨声

我认为根本没有 /anything/ 错误。我已经在这个网站的答案中发布了可能超过 20 种递归不同的表达式语法。它们应该提供激励示例(显示运算符优先级并用这些括号推翻它们)。

【讨论】:

  • 您能告诉我为什么以下代码会因“堆栈溢出”错误而崩溃吗? pastie.org/8732392 输入数据 - pastie.org/8732447 我猜这是在我的规则中添加递归的结果。我对吗?我该如何解决?
  • 左递归和 PEG 语法 :) 他们不混合
  • 你能改写一下吗?精神振奋怎么办?
  • 这只是为了修复编译问题(规则隐藏类型名称):coliru.stacked-crooked.com/a/25bbfd4abfc719f1
  • 好的,谢谢。我正在使用 MSVC-11.0 和 boost 1.54,它根本没有给我任何错误。你能回答我关于规则递归和堆栈溢出的问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-06
  • 2014-01-12
相关资源
最近更新 更多