您的位置 首页 java

JAVA开发C语言解释器:数组元素的读取和赋值

本节技术内容难度较大,一个成熟的编译器或者解释器,要能够解析和执行目标语言开发的复杂 程序代码,我们用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] 的代码执行树:

上面两部分执行树结合起来,得到最终求和赋值语句的执行树:

图二,图三,图六构成了整段代码执行树的主体部分,通过遍历这三部分执行树,执行相应动作,就可以实现本节数值赋值和读取程序所要实现的功能了

文章来源:智云一二三科技

文章标题:JAVA开发C语言解释器:数组元素的读取和赋值

文章地址:https://www.zhihuclub.com/180539.shtml

关于作者: 智云科技

热门文章

网站地图