请问编译器解析类型/变量的阶段用得着语法树吗?

2018-03-30 23:30:33 +08:00
 miaowei
最近在折腾写一个小编译器, 我不是科班出身,没学过编译原理,所以想偷个懒问问大家.
我现在在写 parser. 解析类型或变量 /函数声明,也就是像:
typedef unsigned short u16;
int abc;
int main(int argc, char *argv[]);
之类的 statement,感觉用不着语法树.把"u16"放到类型名称的 name space 里(一个 map),把"abc","main",放到变量 /函数的 name space 里(公用另一个 map),就行了吧?

怀疑用 AST,是因为今天写了句:
int (abc);
这样奇怪的变量声明, gcc 竟然也编译过了, 我想 gcc 的作者不会无聊到专门处理小括号,是不是在 AST 里顺便把这对小括号干掉了?

准备去 github 上扒个开源的小编译器读, 有相关经验的朋友可否先指点我一下.
1426 次点击
所在节点    问与答
4 条回复
feather12315
2018-03-31 01:16:55 +08:00
感觉这描述的想是语法分析,是要构建抽象语法树的。
geelaw
2018-03-31 02:04:21 +08:00
Implicit 和 explicit 的区别罢了,你可以 1-pass 走出来的话可以不用把解析树存到内存里,你可以想象自己在解析树上行走。甚至在 multi-pass 的情况下你还可以反复 on-the-fly 行走。

真的在内存里表示这样一棵树的方法更加系统化,扩展起来也简单,是值得提倡的方法论。
Valyrian
2018-03-31 06:02:56 +08:00
ecnelises
2018-03-31 10:36:14 +08:00
你找个 cdecl 读读吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/443001

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX