我正准备为一种类似 mathematica 的语言编写一个解析器,并且发现有时调用我的 spirit 语法来解析表达式的子部分会很好。
即如果我要解析
a+b*c+d
在查询 '+' 符号时,在 'b*c' 部分调用 parse()
会很方便。
在使用我的语法的相同 实例时可以这样做吗? (语法参数将是'*this')
虽然我还不确定这是否是完成此特定任务的最佳方法,但我发现这个问题很有趣,因为我在文档中找不到任何内容。
如果我使用这种技术,显然我不应该依赖类局部变量或全局变量。但我想知道它是否主要是 spirit 设计所允许的。
编辑:
我的语法实例如下所示:
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
}
}
谢谢!
最佳答案
当然可以:
// In one or two rules I would like to invoke parse(...,*this,...)
// on a subrange of the expression
^ 这不是规则在声明性语法中的组成方式。您似乎从过程的角度考虑了这一点(这可能表明您以前可能有编写递归下降解析器的经验?)。
在我的脑海中,一个简单的表达语法在 spirit 上可能看起来像这样:
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
最后一个分支中的递归:它解析带括号的表达式。
这个简单的示例实际上不会生成反射(reflect)运算符优先级的解析树。但是 Spirit 库中的示例和测试包含许多示例。
另请参阅我的其他答案,这些答案更详细地展示了它是如何工作的(带有完整示例):
Boost::Spirit Expression Parser
一个完整的例子,带有指向文档样本的链接和提问者对原始代码改进的解释
希望对你有帮助
关于c++ - 是否允许递归 boost spirit 语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12616766/