如何从YACC获得AST
How to get the AST from YACC?
我知道如何使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的全局指针,而不是一个充满这些指针的数据结构。
相关文章:
- 正在查找文档以获得PS4平台的C++中的设备信息
- 如何从C++中的依赖类型中获得它所依赖的类型
- 欧拉项目#8答案是大以获得有效答案
- 如何使用C/C++在MacOSX中获得键盘布局
- 如何在不产生任何垃圾的情况下获得C中的像素
- 有没有一种方法可以在编译时获得作用域类名
- 如何克服提升精神AST混乱
- 如何在C++中获得"静态纯虚拟"功能?
- 如何设置一个范围来提取我想要获得的信息
- 在多次运行中获得一致的callgrind输出
- 通过错误处理,在C++中可靠地获得用户十六进制输入
- 如何在Directwrite中获得给定字体的可用OpenType功能
- 在我的代码中,获得最大的Pair Wise产品C++和输出并不总是正确的
- 当用户在qtablewidget中输入单元格时,如何获得信号?C++
- 未获得字符串中的预期输出
- C++需要帮助从用户那里获得一个整数,并确保它在另外两个整数之间
- Qt:当QListView获得新条目时,如何更新QStringList
- 我可以用clang AST从模板专业化中获得默认的模板参数吗
- Eclipse CDT:获得C 项目的AST
- 如何从YACC获得AST