是否允许使用递归提升精神语法?

时间:2012-09-27 08:08:06

标签: c++ boost boost-spirit

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

即。如果我要解析

a+b*c+d 

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

使用我的语法的相同实例时可以这样做吗? (语法参数为'* 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
    }
}  

谢谢!

1 个答案:

答案 0 :(得分:7)

当然你可以:

// 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库中的示例和测试包含 许多 示例。

另见我的其他答案,更详细地展示了它的工作原理(包括完整样本):

希望有所帮助