我知道如何让YACC生成一个AST,但你怎么实际得到它?我的意思是,你如何从YACC实际获得根节点的值?
答案 0 :(得分:6)
Yacc一次只能给你一个节点,并且总是你刚才提供yacc的东西,也就是说,无论你想从减少的产量或任何你想要的东西返回的东西从终端符号返回。 (对不起,你说你知道这一点,但有些读这篇文章的人可能不会。)
所以,根据你从root或top规则返回的内容,并以你喜欢的方式保存它(在附加的C缩减代码中)。
答案 1 :(得分:2)
Yacc给你的是一个解析树,它与AST不同。在浏览解析树的每个节点时(通过yacc),你需要自己构建AST。
答案 2 :(得分:0)
它不像解析器直接返回AST那样优雅,但我想出的最好的方法是使用线程安全插入方法来建立全局数据结构(例如向量或链表)如果需要线程安全性,并且让顶级yacc规则将其结果(也称为$$
)添加到该数据结构中。然后,您可以在其他功能中访问此结果。当然,如果你只想输出一个AST,那么可能只需要一个指向该AST的全局指针,而不是一个充满它们的数据结构。
答案 3 :(得分:0)
我就这样做了:
yacc文件中的(your_grammar.y):
%parse-param {AstNode **pproot}
%parse-param {char **errmsg}
调用程序中的(your_program.c):
res = yyparse(&pAst, &errmsg);
AST节点被分配并链接为yyparse()中的树(您创建逻辑),并且根节点的地址在pAst指针中传回。