【问题标题】:Are recursive boost-spirit grammars allowed?是否允许递归增强精神语法?
【发布时间】:2012-09-27 08:08:06
【问题描述】:

我即将为类似数学的语言编写解析器,并且发现有时调用我的精神语法来解析表达式的子部分会很好。

即如果我要解析

a+b*c+d 

在查询“+”号时,在“b*c”部分调用parse() 会很方便。

在使用我的语法的 same 实例时可以这样做吗? (语法参数是'*this')

虽然我尚未完全确信这是否是完成此特定任务的最佳方式,但我发现这个问题相当有趣,因为我在文档中找不到任何内容。

如果我使用这种技术,显然我不应该依赖类局部变量或全局变量。但我想知道它是否主要是精神设计允许的。

编辑

我的语法实例如下所示:

class MyGrammar : public boost::spirit::qi::grammar<...>  
{  
    /* a few rules. Some with local and/or inherited attributes */  
    MyGrammar( void )  
    {
         /* assign all the rules, use a few 'on_error' statements */
         // In one or two rules I would like to invoke parse(...,*this,...)  
         // on a subrange of the expression
    }
}  

谢谢!

【问题讨论】:

  • 这是一个高度非特定的问题,带有无意义的代码 sn-p。为什么不从文档中的示例开始:boost-spirit.com/home/doc
  • @sehe 这怎么不具体?我想知道 boost-spirit 是否支持使用相同的语法实例对 parse() 进行递归调用。 (是或否)

标签: c++ boost boost-spirit


【解决方案1】:

当然可以:

// In one or two rules I would like to invoke parse(...,*this,...)  
// on a subrange of the expression

^ 这不是规则在声明性语法中的组成方式。您似乎从程序方面考虑这一点(这可能表明您以前可能有编写递归下降解析器的经验?)。


在我的脑海中,一个简单的精神表达语法可能看起来像这样:

  literal     = +qi::int_;
  variable    = lexeme [ qi::alpha >> *qi::alnum ];
  term        =  literal 
               | variable 
               | (qi::lit('(') > expression >> ')');

  factor      = term >> *(qi::char_("+-") >> term);
  expression  = factor >> *(qi::char_("*/%") >> term);

注意term 的最后一个分支中的递归:它解析带括号的表达式。

这个简单的示例实际上不会生成反映运算符优先级的解析树。但是 Spirit 库中的示例和测试包含 许多 示例。

另请参阅我的其他答案,这些答案更详细地展示了它是如何工作的(带有完整示例):

希望有帮助

【讨论】:

  • 好的。谢谢你。我实际上最终使用简单的规则来实现它。 (这比我最初想象的要容易) - 但是。你回答了这个问题!
猜你喜欢
  • 2023-04-03
  • 1970-01-01
  • 2015-07-03
  • 2016-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多