• 对openjdk的javac编译器扩展了一个语法糖


    我的扩展功能描述如下:

    在java的现有语法中加入var来声明变量,并且可以根据初始化数据来自动类型推导。

    举两个例子:

    例一:

     如下JAVA代码(注意这里的var是新语法):

    import java.util.*;
    
    public class TestHello {
        
        private var i = new ArrayList<List<?>>();
    
    }

    在用我修改的编译器编译之后,再用反编译工具反编译之后会看到如下形式的代码:

    import java.util.ArrayList;
    import java.util.List;
    
    public class TestHello
    {
      private ArrayList<List<?>> i = new ArrayList();
    }

    例二:

    如下JAVA代码(注意这里的var是新语法):

    public class TestInit {
        public var v = 1.0;
    }

    在用我修改的编译器编译之后,再用反编译工具反编译之后会看到如下形式的代码:

    public class TestInit
    {
      public double v = 1.0D;
    }

    思路本身非常简单:

    1.用初始化语句右表达式的类型做为变量的类型。

    2.如果没有初始化值,或为空,则无法推导,这时就直接用Object。

    不过:

    因为我刚刚对javac的源代码研究了一天,仅仅是大致看了“词法分析”和“语法分析”的代码,所以我做这个语法扩展是在语法分析的过程中加的代码,这样的做法是有局限性的,即:只有当初始化表达式中存在常量,或用new操作符后面有声明类型的情况下才可以自动类型识别,而不能对于用函数调用(或属性引用)来初始化变量的情况进行识别(这是因为在语法分析过程中,分析到这个变量初始化的语句时,通常还没有分析到依赖的其它资源呢),所以如果要做得全面一些,则不能在语法分析过程进行类型识别,而是要在整个语法分析完成之后再第二次扫描语法树,这样就可以做到了。

    暂时不打算再继续完善这个扩展了,以后如果实现自己的语言编译器再考虑完整的类型识别系统实现。

    我的代码可以在这里下载:https://github.com/naturemickey/valjavac

    下载后在代码中搜“ADD BY ZHOUYOU”就可以找到我写的代码(只有几十行而已),其它的代码都是openjdk的。

    注意:我是用jdk8u40的javac代码来修改的,所以读者如果要自己实践的话,需要安装jdk8(java编译器是bootstrap的,完全用java编写的)。

    由于很多人对javac的代码不熟(其实我也只是刚刚接触第二天而已,也不熟),所以再多提一句:

    openjdk的javac运行的主类是com.sun.tools.javac.Main,直接运行这个类,并把要编译的文件名做为main函数的参数即可。

  • 相关阅读:
    [原创]ExtAspNet秘密花园(二) — 一切从头开始
    使用领域定义建模语言来提高生产力
    报表控件团队成立了!!
    常见的程序语言分类的区别(简要说明)
    怎样做一名“专业”的程序员?
    推荐一个计数器网站
    在c中嵌入sql操作PostgreSQL
    让Visual C++ 2005 Express Edition也可以开发windows应用程序
    使用PowerDesigner进行代码生成
    sdmagazine与Dr. Dobb's Journal合并了?
  • 原文地址:https://www.cnblogs.com/naturemickey/p/4444145.html
Copyright © 2020-2023  润新知