网站首页 > java教程 正文
本节技术内容难度较大,一个成熟的编译器或者解释器,要能够解析和执行目标语言开发的复杂 程序代码,我们用java开发的c语言解释器,能够执行用C语言开发的较为复杂的程序时,才称得上是合格的,从本节开始,我们致力于C语言解释器的开发,要实现的目标是,我们解释器能够正确地解析用C语言实现的快速排序功能的程序,程序的样例如下:
#include <stdio.h>
int a[5];
void init(){
int i;
for (i = 0; i < 5;i++) {
a[i] = 4-i;
}
}
void quicksort(int begin ,int end){
if(begin>=end){
printf("begin >= end ,return");
return;
}
int v;
int p;
p = begin;
v=a[p];
int b;
int e;
b = begin;
e = end;
while(b<e){
while(b<e && a[e]>=v){
e--;
}
while(b<e && a[b] <=v){
b++;
}
int temp = a[e];
a[e] = a[b];
a[b] = temp;
}
a[begin] = a[b];
a[b] = v;
quicksort(begin,b-1);
quicksort(b+1,end);
}
int main() {
printf("Hello, World!\n");
init();
quicksort(0,4);
int i;
i=0;
do {
printf("%d",a[i]);
i++;
} while (i<5);
return 0;
}
我们的解释器如果能够顺利执行上面的代码,实现快速排序算法对给定的数组竞选排序的功能,那表明我们的解释器就已经有一定de的成熟度了。
上面的程序中,需要对数组进行相应的赋值和读取,要想我们的解释器能够顺利执行上面的代码,解释器需要懂得如何根据源代码指定的意图,,对数组元素进行读取或者赋值操作,本节的主要目标就是实现这一功能,完成本节后,我们的解释器可以正确的执行下面的c语言代码。
void f() {
int b ;
int a[3];
a[0] = 1;
a[1] = 2;
b = a[0] + a[1];
}
我们先从语法上看,数组的定义是如何被语法表达式说明的:
var_decl->var_decl LB const_expr RB
上面的语法推导表达式用来对应数组的类型声明,其中var-decl解析int a 这一部分,LB对应左中括号,const_expr对应数组的长度,也就是元素的个数,对应于代码就是数字3,RB则对应右括号],
对数组某个元素的访问则通过下面的语法表达式实现:
unary->unary LB expr RB
例如a[0],那么表达式右边的unary对应的就是数组变量名a,LB对应的左括号,expr对应0,RB对应右括号
我们看看a[0]对应的代码执行树是怎么样的,执行树的构建过程和代码实现
a[0] = 1, 也就是对数组元素赋值这一程序逻辑对应的执行顺序如下:
同理,语句a[1] = 2 所对应的执行树,结构与上面一模一样,只不过细节有点改变而已,于是生成的执行树结构如下:
对于求和语句 b = a[0] + a[1], 解释器先对变量b构造其解析树:
我们再构造a[0] + a[1] 的代码执行树:
上面两部分执行树结合起来,得到最终求和赋值语句的执行树:
图二,图三,图六构成了整段代码执行树的主体部分,通过遍历这三部分执行树,执行相应动作,就可以实现本节数值赋值和读取程序所要实现的功能了
猜你喜欢
- 2024-11-16 java开发中经常使用的数组以及使用方法
- 2024-11-16 为什么要使用数组?如何使用数组?(什么是数组为什么要使用数组)
- 2024-11-16 PHP的SPL扩展库(二)对象数组与数组迭代器
- 2024-11-16 ES6 数组解构赋值(es6 结构赋值)
- 2024-11-16 java笔记之数组(java,数组)
- 2024-11-16 PHP笔记 (七)数组(php7 数组)
- 2024-11-16 Scala学习数组和元组了解(scala数组集合的操作)
- 2024-11-16 Java——数组函数(java 数组使用)
- 2024-11-16 VBA一组代码如何搞定赋值给数组arr及回填数据给工作表
- 2024-11-16 java数组(一)(java 数组)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)