如何从YACC获得AST

How to get the AST from YACC?

本文关键字:获得 AST YACC      更新时间:2023-10-16

我知道如何使YACC生成AST,但是如何实际得到它呢?我的意思是,如何从YACC中得到根节点的值?

Yacc一次只给您返回一个节点,并且总是您在早些时候刚刚给Yacc的东西,即,您想要从减少的生产返回的任何内容或您想要从终端符号返回的任何内容。(对不起,你说你知道,但有些人可能不知道。)

因此,无论您从根规则或顶部规则返回什么,并以任何您喜欢的方式保存它(在附加的C还原代码中)。

Yacc为您提供的是一个解析树,它与AST不同,您需要在遍历解析树的每个节点时(通过Yacc)自己构建AST。

我是这样做的:

yacc文件(your_grammar.y)中的

:

%parse-param {AstNode **pproot}
%parse-param {char **errmsg}

在调用程序(your_program.c):

res = yyparse(&pAst, &errmsg);

AST节点在yyparse()中作为树分配和链接(您创建逻辑),根节点的地址在pAst指针中传递回来。

它不如让解析器直接返回AST那么优雅,但是我想到的最好的方法是拥有一个全局数据结构(例如向量或链表),如果需要线程安全,则使用线程安全的插入方法,并让顶级yacc规则将其结果(也称为$$)添加到该数据结构中。然后,您可以在其他函数中访问此结果。当然,如果您只输出一个AST,那么可能只需要一个指向该AST的全局指针,而不是一个充满这些指针的数据结构。