java ast 语法树解析-解析Java AST语法树:gcj2012大会报告
javaast语法树解析器设计者是gcj2012大会上,jacobmuskey教授的一篇报告。链接如下:-muskey_sa.pdf在这篇报告中,jacobmuskey提出了一种新的语法树解析器,使用基于流图来设计语法树的过程。ast是一种语言级别的树形结构,可以与已有语言各种元素进行组合和拼接。语法树是面向树的数据结构,而不是像字符串,哈希表这样的文本结构。
java和c++的一个重要区别在于,java的语法树结构更多的是由编译器负责设计生成。java为一个源程序(也可以理解为helloworld这样的helloworld)设计一个语法树,然后编译器负责根据这个语法树,把所有的功能编译成一个class文件,最后调用相应的机器来执行这个class文件。语法树中的一个非常重要的环节就是从每个叶子节点发出跳转指令。
每个节点需要在函数内,可以是一个静态方法java ast 语法树解析,也可以是方法的一个非定义行为,例如static成员,一个注解,一个参数列表,一个状态条件等等。一个语法树由节点加数组构成。而根节点需要对应编译器中的节点,此处的节点是指开始,有两种情况:第一种,根节点与所有叶子节点,也就是首节点直接对应。第二种,根节点与当前任务结束位置对应。
java是一种通过字节码的形式,将程序编译成目标文件的一种语言。字节码的形式如下图:每一段字节码就是一行代码,这就是一段没有任何重载的源文件。每一行代码都是由x78压缩编码的,这里的x78编码就是一个字节数组,定义在class文件中。字节码中的每一行代码会被用跳转指令将它切分为每个字节码块。因为每个字节码块都是为一个常量定义的,当初常量值是255,那么它被定义为一个常量值序列,由常量构成一个节点。
同样的java ast 语法树解析,如果是32位浮点数,那么它被定义为一个常量值序列,为0x48位,每一个常量是一个0xe4元素。java源文件的目标文件格式也是以字节码的形式进行定义的。字节码定义如下:publicclassmain{publicstaticvoidmain(string[]args){finalstringstr[]="helloworld";finalinti=5;//初始化时的变量inta=4;//定义一个整数常量,等于0finalstringb="world";//定义一个字符常量,等于"world"finalstringc=a;//定义一个字符常量,等于"world"finalstringd=str[2];//定义一个字符常量,等于"world"finalstringe="world";//定义一个数组长度为2的常量,等于4,其中a和d是常量,其余为空finalstringf="";//跳转指令,跳过当前元素finalfloatresult。