• 宫文学Richard
    置顶
    2020-06-30
    上一讲的参考: 对于a>b*2+3, step1: a 移进a step2: a,b > * 移进>,再移进b。那现在能否对a>b做规约呢?不能,因为后面跟的是*,优先级更高。 step3: a,b,2 >,* + 所以继续移进*和2.那现在能不能对b*2做规约呢?可以的。因为后面跟的是+,优先级更低。 step4: a,b*2 > + 规约掉b*2 step5: a,b*2,3 >,+ 继续移进+和3。现在后面已经是$了,所以不需要再移进了,接下来就连续做规约。 step6: a,b*2+3 > 规约掉+操作,把操作数栈顶弹出两个值来,构建一棵加法子树。 step7 a>b*2+3 再把>操作规约掉。 注意,我可能一步会做两个移进,而你的步骤会比我多。但没关系,只要掌握算法规则就行了。
    
    6
  • wusiration
    2020-06-29
    我的理解是有四个作用域,一个ScopeTest类的作用域,一个foo函数内部的作用域,if语句a>0分支中的作用域以及if语句else分支中的作用域。

    作者回复: 我已经在下一讲发了参考解答,你可以对照一下:-)

    
    2
  • lion_fly
    2021-05-19
    老师,您好,HelloWorldProcessor中是通过直接写文件的方式来生成相应的编译后的目标类,想问下老师,如何去通过修改语法树的方式来修改目标的类呢?我个人这边看到的资料,都是基于JDK8的来实现的,因为JDK8中是可以直接访问jdk.compiler中的定义的语法树的节点的,但是现在的JDK15这些数据结构已经无法直接在JDK的外部来直接访问了

    作者回复: 一个方法,Hack进去,修改编译器,然后发布你自己的版本的JDK。因为Graal都是开源的嘛。这个方法的麻烦之处,是你的程序只能运行在你的版本的JDK上。 更常用的方法,是直接生成字节码,这样就不用改编译器了。不过,你需要熟悉一下字节码的原理,然后用字节码生成工具去生成。我前两天参加鸿蒙的会议,碰到一个哥们,就是用这个思路,生成.NET的字节码,实现了一个游戏编程平台。

    共 2 条评论
    1
  • lion_fly
    2021-03-03
    老师可以提供一下这个类HelloWorldProcessor.java的源代码吗?

    作者回复: 在Github上是有的。 https://github.com/RichardGong/CompilersInPractice/blob/master/javac/src/main/java/HelloWorldProcessor.java

    共 2 条评论
    1