这个问题是
“Iterative update of abstract syntax tree with boost spirit”的后续问题.
已知:
>解析器语法允许递归
要求是:
>解析器的AST必须是BGL图.
>输入可以是每个解析器步骤的一对多符号
思路:
>关于精神解析为BGL图的一些基本思想在这里显示Using boost graph library: how to create a graph…,但不完全满足要求,因为我希望能够迭代地解析一对多符号.
>猜猜BGL图和精神解析器必须知道彼此的某些信息才能在正确的位置填充数据.首先想到的是,解析器必须能够处理图顶点.
> Using semantic actions/qi::locals等解决方案可能适用,但我不确定这是否足以让解析器迭代地处理图形.
有没有人有一些想法如何解决这个问题,还是指向某个方向?
谢谢
最佳答案 简而言之:这很难实现.
如果想要将一些数据解析为BGL图,最简单的方法可能是使用BGL图形适配器vector_as_graph.给定此适配器并且鉴于boost精神解析器可以解析为向量,那么它是可能的.
enum { r, s, t, u, v, w, x, y, N };
char name[] = "rstuvwxy";
typedef std::vector < std::list < int > > Graph;
Graph g(N);
g[r].push_back(v);
g[s].push_back(r);
g[s].push_back(r);
g[s].push_back(w);
g[t].push_back(x);
g[u].push_back(t);
g[w].push_back(t);
g[w].push_back(x);
g[x].push_back(y);
g[y].push_back(u);
boost::print_graph(g, name);
我使用的解决方案是在boost精神域中解析给定的语法,然后执行到AST的转换,以便表示为BGL图.
最后的想法:应该注意的是,提升精神和BGL领域的学习曲线相当陡峭.基于此,如果分开,可读性和实现更容易.不是说它无法解决.