iol*_*olo 5 c++ boost boost-spirit
我即将为类似mathematica的语言编写一个解析器,并且已经发现,有时会调用我的精神语法来解析表达式的子部分.
即如果我要解析
a+b*c+d
Run Code Online (Sandbox Code Playgroud)
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
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
当然可以:
// In one or two rules I would like to invoke parse(...,*this,...)
// on a subrange of the expression
Run Code Online (Sandbox Code Playgroud)
^这不是规则在声明性语法中组成的方式.您似乎在程序性的术语中想到了这一点(这可能表明您之前有过编写递归下降解析器的经验吗?).
在我的脑海中,精神上的简单表达语法可能如下所示:
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);
Run Code Online (Sandbox Code Playgroud)
注意在最后一个分支中的递归term:它解析括号表达式.
这个简单的示例实际上不会产生反映运算符优先级的解析树.但是Spirit库中的示例和测试包含许多例子.
另请参阅我的其他答案,以更详细地展示其工作原理(包含完整示例):
一个完整的示例,包含文档示例的链接以及提问者对原始代码改进的解释
希望有所帮助
| 归档时间: |
|
| 查看次数: |
2064 次 |
| 最近记录: |