V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
miaowei
V2EX  ›  问与答

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

  •  
  •   miaowei · 2018-03-30 23:30:33 +08:00 · 1425 次点击
    这是一个创建于 2415 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近在折腾写一个小编译器, 我不是科班出身,没学过编译原理,所以想偷个懒问问大家.
    我现在在写 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 上扒个开源的小编译器读, 有相关经验的朋友可否先指点我一下.
    4 条回复    2018-03-31 10:36:14 +08:00
    feather12315
        1
    feather12315  
       2018-03-31 01:16:55 +08:00 via Android
    感觉这描述的想是语法分析,是要构建抽象语法树的。
    geelaw
        2
    geelaw  
       2018-03-31 02:04:21 +08:00 via iPhone
    Implicit 和 explicit 的区别罢了,你可以 1-pass 走出来的话可以不用把解析树存到内存里,你可以想象自己在解析树上行走。甚至在 multi-pass 的情况下你还可以反复 on-the-fly 行走。

    真的在内存里表示这样一棵树的方法更加系统化,扩展起来也简单,是值得提倡的方法论。
    Valyrian
        3
    Valyrian  
       2018-03-31 06:02:56 +08:00
    ecnelises
        4
    ecnelises  
       2018-03-31 10:36:14 +08:00 via iPhone
    你找个 cdecl 读读吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2827 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 02:08 · PVG 10:08 · LAX 18:08 · JFK 21:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.