简易编译器实现,最终翻译成伪汇编代码
项目太老,原先在eclipse上实现的,现在已经迁移到AndroidStudio,把分支切换到dev_android打开即可
- func 用于定义函数
- main 主函数名,文件中必须包含主函数
- while 循环关键字
- if 条件分支 关键字
- else 必须与if 一起才能识别
- num 数字类型
- string 字符串类型
- bool 布尔值类型
-
- <
-
=
- <=
- ==
示例:
func main(){
num a,b;
a=1;
b=0;
while(b<5){
num c,k;
b=b+1;
if(b<3){
c=b+b*a;
}else{
c=b;
}
}
num d,c;
c=1;
a=b\*a\*c+b*4;
}
输出伪汇编代码(三地址码的四元式)格式为:<操作符,操作数1,操作数2,结果存放> 以上示例的输出结果:
- DEFINE , num , null , a
- DEFINE , num , null , b
- SEND , 1 , null , a
- SEND , 0 , null , b
- LABEL , null , null , Label1
- CJMP_L , b , 5 , Label2
- DEFINE , num , null , c
- DEFINE , num , null , k
- ADD , b , 1 , $
- SEND , $ , null , b
- CJMP_L , b , 3 , Label3
- MUL , b , a , $
- ADD , b , $ , $
- SEND , $ , null , c
- LABEL , null , null , Label3
- SEND , b , null , c
- JMP , null , null , Label1
- LABEL , null , null , Label2
- DEFINE , num , null , d
- DEFINE , num , null , c
- SEND , 1 , null , c
- MUL , b , a , $
- MUL , $ , c , $
- MUL , b , 4 , $
- ADD , $ , $ , $
- SEND , $ , null , a
##个别操作符的含义:
- DEFINE: 定义变量
- SEND : 赋值
- JMP: 无条件跳转
- CJMP_E: 等于时执行下面的语句,否则跳转到某个label
- CJMP_B : 大于时........
- CJMP_B_E : 大于等于的时候......
- LABEL: 定义一个标签(用于跳转)
- $ : 用于存放左边操作数运算的结果,或者代表上面的运算结果,主要作用是把被分解的表达式连接起来
- null 表示该操作数不进行操作,仅仅起占位的作用
- 为了简化编译工作
- t语言只支持一个mian(),函数,所以不分析函数之间的跳转
- t语言只支持变量之间的加减乘除,自动识别运算优先级,不允许使用()
- t语言以只支持while这一种循环,而且不支持break跳出循环。
由于第一次编写编译器,所以很多工作可能不是很好,但是对于理解编译原理,还是有很大帮助的,有意向的同学欢迎交流....