首页 > 编程语言 >java开发C语言解释器:数组元素的读取和赋值

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

时间:2023-06-14 11:07:56浏览次数:37  
标签:解释器 end int begin C语言 数组 java 对应


本节技术内容难度较大,请结合视频对代码的讲解和调试来理解本节内容:
用java开发编译器

一个成熟的编译器或解释器,要能够解析和执行目标语言开发的逻辑复杂的程序代码,我们用java 开发的C语言解释器,能够执行用C语言开发的较为复杂的程序时,才称得上是合格的,从本节开始,我们致力于C语言解释器的开发,要实现的目标是,我们的解释器能够正确的解析用C语言实现的快速排序功能的程序,程序样例如下:

int a[] = {10, 8, 3, 5, 2, 4, 7 , 1, 6, 9}

void quickSort(int begin, int end) {
    int pivot = a[(begin + end) / 2];
    int old_begin = begin;
    int old_end = end;

    while (begin < end) {
       if (a[begin] >= pivot) {
           int temp = a[begin];
           a[begin] = a[end];
           a[end] = temp;
           end--;
        } else {
           begin++;
        }     
    }

    quickSort(old_begin, begin);
    quickSort(end, old_end);
}

quickSort(0, 9);

如果我们的解释器能够顺利的执行上面代码,实现用快速排序算法对给定数组竞选排序的功能,那表明,我们的解释器就已经有一定的成熟度了。

上面的程序中,需要对数组的相应元素进行读取或赋值,要想我们的解释器能够顺利执行上面代码,解释器需要懂得如何根据源代码指定的意图,对数组元素进行读取或赋值操作,本节的目标就是实现这一功能。完成本节功能后,我们的解释器能够正确的解析和执行下面的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]对应的代码执行树是怎样的,执行树的构建过程的代码实现和讲解请参看视频。

(图一:)

java开发C语言解释器:数组元素的读取和赋值_编译器

(图二:)

a[0] = 1, 也就是对数组元素赋值这一程序逻辑对应的执行树如下:

java开发C语言解释器:数组元素的读取和赋值_快速排序_02

同理,语句a[1] = 2 所对应的执行树,结构与上面一模一样,只不过细节有点改变而已,于是生成的执行树结构如下:

(图三:)

java开发C语言解释器:数组元素的读取和赋值_快速排序_03

对于求和语句 b = a[0] + a[1], 解释器先对变量b构造其解析树:

(图四:)

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

我们再构造a[0] + a[1] 的代码执行树:

(图五:)

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

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

(图六)

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

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

由于本节内容技术难度较大,请结合视频的讲解和调试演示来理解本节内容。


标签:解释器,end,int,begin,C语言,数组,java,对应
From: https://blog.51cto.com/u_16160261/6476204

相关文章

  • java开发C编译器:把函数调用编译成字节码
    本节,我们研究如何把函数声明和函数调用转换成可执行的java字节码,在完成本节代码后,我们的编译器能把下面代码编译成可被java虚拟机执行的字节码,示例代码如下:voidf(){printf("executefunctionf()");}voidmain(){f();}假设java一个类含有如下方法:publicfloatco......
  • java开发操作系统内核:让内核突破512字节的限制
    我们当前的系统内核,必须包含在虚拟软盘的第1扇区,由于一个扇区只有512字节,因此,系统内核的大小不可能超过512字节。但是,一个拥有完善功能的内核不可能只有512字节,因此要想越过512字节的限制,具体的做法就是做一个内核加载器,放入到第一扇区,加载器加载如内存后,再将内核从软盘加载到系统......
  • java开发编译器:LR 状态机的缺陷与改进
    前两节我们构造的状态机有些缺陷,当我们进入某个状态节点时,根据该节点的特性,我们需要产生一些动作,根据上两节的有限状态机图,当我们进入节点5,我们发现,符号”.”为位于表达式的最右边,在.后面不再有其他非终结符或终结符,进入这样的节点时,我们要根据表达式做一次reduce操作,例如在节点5......
  • java开发C编译器:结构体的解析和执行
    更详细的讲解和代码调试演示过程,请参看视频用java开发C语言编译器结构体是C语言中,最为复杂的原生数据结构,它把多种原生结构结合在一起,形成一个有特点含义的数据结构,要实现一个完整的C语言编译器或解释器,就必须要拥有对结构体的解析能力,本节,我们在当前解释器的基础上,增加结构体的解......
  • 用java做操作系统内核:软盘读写
    在前两节,我们将一段代码通过软盘加载到了系统内存中,并指示cpu执行加入到内存的代码,事实上,操作系统内核加载也是这么做的。只不过我们加载的代码,最大只能512byte,一个操作系统内核,少说也要几百兆,由此,系统内核不可能直接从软盘读入系统内存。通常的做法是,被加载进内存的512Byte程......
  • java开发系统内核:caps 按键处理
    更详细的讲解和代码调试演示过程,请参看视频LinuxkernelHacker,从零构建自己的内核上一节,我们成功实现了对shift按键的处理,这一节,我们看看如何处理caps按键,当该键按下时,输入系统的字符在大小写间切换。由于我们系统启动后,默认输入是大写字符,完成本节后,我们把系统的默认字符改成......
  • java开发系统内核:像Linux一样使用中断实现内核API
    我们当前提供的内核API有个问题,就是每次使用时,需要计算API函数在内核中的位置,一旦内核代码改变,API接口的位置也会改变,同时调用API的应用程序也必须跟着改变,显然这种限制是不可接受的。为了突破当前缺陷,我们必须想出新的API提供办法。常用的做法是,仿照Linux将API当做一个中断调用,由......
  • java开发系统内核:使用C语言开发系统应用程序
    更详细的讲解和代码调试演示过程,请参看视频用java开发C语言编译器更详细的讲解和代码调试演示过程,请参看视频如何进入google,算法面试技能全面提升指南如果你对机器学习感兴趣,请参看一下链接:机器学习:神经网络导论更详细的讲解和代码调试演示过程,请参看视频LinuxkernelHacker,......
  • java开发C语言编译器:JVM 的基本操作指令介绍及其程序运行原理
    更详细的讲解和代码调试演示过程,请参看视频用java开发C语言编译器更详细的讲解和代码调试演示过程,请参看视频如何进入google,算法面试技能全面提升指南如果你对机器学习感兴趣,请参看一下链接:机器学习:神经网络导论更详细的讲解和代码调试演示过程,请参看视频LinuxkernelHacker,......
  • 编译原理动手实操,用java实现一个简易编译器-语法解析
    语法和解析树:举个例子看看,语法解析的过程。句子:“我看到刘德华唱歌”。在计算机里,怎么用程序解析它呢。从语法上看,句子的组成是由主语,动词,和谓语从句组成,主语是“我”,动词是“看见”,谓语从句是”刘德华唱歌“。因此一个句子可以分解成主语+动词+谓语从句:句子-->主语+动词+谓语......