2012-09-27 31 views
5

我正准备为类似mathematica的语言编写一个解析器,并且发现,有时会调用我的灵魂语法来解析表达式的子部分,这将是很好的。是否允许递归助推精神语法?

即如果我要解析

a+b*c+d 

这将是很方便的调用parse()上的“B * C”的一部分,而查询“+”号。

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

谢谢!

+0

实例怎么样子? – elyashiv

+0

@elyashiv请参阅编辑 – iolo

+1

这是一个高度非特定的问题,带有无意义的代码片段。为什么不从文档中的示例开始:http://boost-spirit.com/home/doc/ – sehe

回答

6

当然可以:

// 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 Library中的样本和测试包含很多的例子。

又见说明其工作原理更详细(全样本)我的其他答案:

希望帮助

+0

好的。谢谢。我实际上最终使用简单的规则来实现它。 (比我想象的要容易) - 但是。你回答了这个问题! – iolo