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的类型了;