📄 程序说明.txt
字号:
本程序是由C语言写的pl0编译程序,是由pascal版的pl0编译程序改写而成。
因C语言与pascal语言有很大的不同,因此本程序作了较大的改动,现说明如下:
1、集合类型的实现:pascal中有字符串类型,而C语言中没有,这给转换带来很大的不便,因此需要自定义
一个集合类型。
先定义集合所有的元素,用枚举类型实现。将集合定义为一结构体,此结构体的元素为相应枚举类型的
数组,为计算方便,另外加以集合元素个数这一属性(用以变量表示)。
然后定义相应的集合操作,如添加元素,删除元素,查找某一元素,以及集合的并、交、补等,本程序
只定义了添加ADD,删除DEL,查找元素IN及集合的并操作Union。
2、字符串:C语言中没有字符串类型,此处用定长字符数组表示
3、关于数组:
(1) pascal中数组可从任意数开始,而C语言中数组只能从0开始,因此本程序将所有的数组转换为以0开始
的形式,相应对涉及到数组的下标的语句进行了修改。
(2) pascal中数组的下标可为字符及字符串,C语言则不能,只能以数字作下标。如mnemonic,把相应
的字符串对应于数字(定义enum fct{lit,opr,lod,sto,cal,intr,jmp,jpc},lit对应值为0,opr为2,
... ),然后分别用char *getmnemonic(int i)取得i对应的字符串。("lit","opr"...)
至于ssym,则没用数组,直接用void getssym(char ch)函数取得ch所代表的符号('+','-'...)。
4、过程到函数的转换:
pascal中过程可嵌套定义,且父过程的局部变量的作用域为整个过程,包括其中定义的子函数;而C语言中
函数不可嵌套定义,函数间的调用可通过参数来传递消息。常规的解决方案是将pascal中的过程定义成C中
的函数,其中父过程中对应的函数中的局部变量通过参数传递给子过程对应的函数。另一种解决方案是另外
开辟一堆栈,函数嵌套调用前将其局部变量入栈,调用后出栈。但考虑到本程序中嵌套层定义的子过程数较
多,通过参数传递的方式将使参数数目过多,而本程序中block的嵌套调用又比较少,因此我的解决方案是
将block的局部变量设为全局变量,不过在嵌套调用block前将其值保存起来,调用后使其恢复为调用前的值,
类似于栈。这样有效的实现了block的嵌套调用(详见程序的注释)。其他的如statement——expression
——term——factor及expression——condition的嵌套定义,虽然也有局部变量的在父子过程中的传递,
但不影响结果,故不作考虑。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -