关于Javac编译器的那点事(一)

Javac是什么?

它是一种编译器,将Java对人非常友好的语言,编译转化对所有机器都非常友好的语言,即:JVM能够识别的语言,也就是Java字节码。而Java字节码,说白了就是一连串二进制数字。

Javac中有什么? 

既然它是编译器, 这时候就要回想一下大学所学《编译原理》;什么词法分析,语法分析,语义分析,目标代码生成,目标代码优化……好吧,我承认这方面,已经被我扔进回收站,等我好好还原一下;

恢复成功,有图为证:

 

 

 下面详细讲一下,Javac中词法分析器的内部原理:

先上图,看一下词法分析器的类结构及功能:(注意:这是简图,与实际还是有些出入的;I代表接口,C代表类)

 

词法分析过程在JavaParser的parseCompilationUnit()方法中进行;

词法分析的结果:就爱那个一个类所有关键词,匹配成Token类任意一项即可;

注:Token中除了,定义了Java语言的保留关键字外;还定义了一个特殊的词:Token.IDENTIFIER,用于表示用户自定义的名称哦!

提出问题:

如何分辨一个个Token?如:为什么就知道package是一个Token.PACKAGE,而不是用户自定义的Token.IDENTIFIER呢?

如何识别一个Token?如:为什么就知道package是一个Token,为什么不是pac或packa呢?

解答问题:

问题一: 因为JavacParser类会根据Java语言的规范控制什么顺序、地方应该出现什么Token; 即:JavacParser已经定义好了Token流的顺序规则;

问题二:判断一个Token是在Scanner.nextToken()中定义的, 其核心由Keywords类负责将Name对象同Token相对应;

过程:利用Java的语法规则,将字符集合转化为Name对象 ---> 构建Name.table这个内部类的Name对象数组  ---> 传出Name对象到Keywords的key()中找到对应的Token

 Keyword类先将Token中所有元素转化成Name对象,然后建立Name对象和Token的对应关系,将关系保存在Keyword类的key数组中。当传入一个Name对象时,通过key数组就可以找到Token的类型了;

 

posted @ 2017-06-16 16:00  简笔话_Golden  阅读(384)  评论(0编辑  收藏  举报