我得到了一个基于 Spirit 的工作解析器+AST,它可以解析参数初始化 - 一切正常
遗憾的是,有些(旧)数据库需要 AST 的部分内容作为原始字符串(我正在准备替换它,但想逐步进行更改)
(简单化)示例:a=10,b=30,c=A *B +10,d={1,A*4,3}*4
KeyValue-Rule = Identifier >> '=' >> Number|Expression
表达式是一个完整的 Sub-AST,带有 +-* 和数字(在这个简单的例子中)
std::vector<KeyValue> Parameters;
数据库希望将参数的“值”作为字符串c
-A *B +10
最好是精确的字符串(带有空格等)
这是 Spirit 可以保留的东西吗(或者开始/结束位置)?
上面的例子是我真正的解析器/AST的一个超级简化版本,表达式可以通过()
等进行深度分级 - 所以它不是简单的按,
事物分割 - 只是为了解释我试图达到的目的
类似: https: //astexplorer.net/ - 我需要字符串中逻辑 AST 部分的起点/终点
是的。您可以使用语义动作:
您可以将自动属性传播与语义动作结合使用,使用
%=
规则初始化而不是常规=
分配。您还可以使用
on_success
“错误”处理程序来自动化操作。请参阅我以前的回答中的一些示例:https://stackoverflow.com/search ?q=user%3A85371+qi+on_success想象一个语法
想出最简单的没有一元运算符或运算符优先级的语法:
在 Coliru 上直播
印刷
添加源注释
延长
Expr
:source
将包含我们的源。制作一个语义动作来从原始输入迭代器设置源:在应该传播已解析的 Ast 和源的规则中散布语义动作:
作为奖励,添加
AnnoatedPrint
访客:现在输出变为Live On Coliru
将其融入问题中
无需进一步评论:
在 Coliru 上直播
印刷