如何从YACC获取AST?

| 我知道如何使YACC生成AST,但是您如何实际获得它?我的意思是,您如何从YACC实际获得根节点的值?     
已邀请:
Yacc一次只给您一个节点,并且总是您在较早的时间就给yacc的东西,即,您想从缩减的生产中返回的任何东西或您想从终端符号返回的任何东西。 (对不起,您说过您知道这一点,但有些人可能不知道。) 因此,将您从root或top规则返回的所有内容都保存下来,并以任意方式将其保存(在附带的C简化代码中)。     
Yacc给您的是一棵解析树,与AST不同。通过解析树的每个节点(通过yacc)时,您需要自己构造AST。     
它不像让解析器直接返回AST那样优雅,但是我想出的最好方法是拥有一个全局数据结构(例如,向量或链接列表),并带有线程安全插入如果需要线程安全,并且具有顶级yacc规则,则将其结果(也称为“ 0”)添加到该数据结构中。然后,您可以在其他功能中访问此结果。当然,如果只输出一个AST,则可能只需要具有指向该AST的单个全局指针,而不是一个充满它们的数据结构。     
这是我的方法: 在yacc文件(your_grammar.y)中:
%parse-param {AstNode **pproot}
%parse-param {char **errmsg}
在调用程序(your_program.c)中:
res = yyparse(&pAst, &errmsg);
AST节点在yyparse()中被分配并链接为树(您进行逻辑处理),并且根节点的地址在pAst指针中传递回去。     

要回复问题请先登录注册