C++ 是否允许使用递归助推语法?

C++ 是否允许使用递归助推语法?,c++,boost,boost-spirit,C++,Boost,Boost Spirit,我即将为一种类似mathematica的语言编写一个解析器,我发现有时候调用我的spirit语法来解析表达式的子部分会很好 i、 e.如果我要分析 a+b*c+d 查询“+”符号时,在“b*c”部分调用parse()会很方便 使用与我的语法相同的实例时是否可以这样做?(语法参数应为“*this”) 虽然我还不能完全确定这是否是完成这项任务的最佳方式,但我觉得这个问题相当有趣,因为我在文档中找不到任何东西 显然,如果我使用这种技术,我不应该依赖于类本地或全局变量。但我想知道这是否主要是精神设计

我即将为一种类似mathematica的语言编写一个解析器,我发现有时候调用我的spirit语法来解析表达式的子部分会很好

i、 e.如果我要分析

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
    }
}  
class MyGrammar:public boost::spirit::qi::grammar
{  
/*一些规则。一些具有本地和/或继承属性*/
我的语法(void)
{
/*分配所有规则,使用一些“on_error”语句*/
//在一个或两个规则中,我想调用parse(…,*this,…)
//关于表达式的子范围
}
}  
谢谢

当然你可以:

// 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);
注意
术语
的最后一个分支中的递归:它解析带括号的表达式

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

另请参阅我的其他答案,这些答案更详细地说明了这一点(带有完整的示例):

  • 一个完整的示例,链接到文档示例,并解释了询问者对原始代码的改进

  • 另一种方法


希望这能有所帮助

这是一个高度非特定的问题,代码片段毫无意义。为什么不从文档中的示例开始:@sehe这是如何非特定的?我想知道boost spirit是否支持使用相同语法实例递归调用parse()。(是或否)好的。非常感谢。实际上,我最终用简单的规则实现了它。(这比我最初想象的要容易)但无论如何。你回答了这个问题!