编译原理上机实习指导书Word文档下载推荐.docx
- 文档编号:15341247
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:26
- 大小:36.40KB
编译原理上机实习指导书Word文档下载推荐.docx
《编译原理上机实习指导书Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《编译原理上机实习指导书Word文档下载推荐.docx(26页珍藏版)》请在冰豆网上搜索。
=main(){<
分程序>
}<
=[<
常量说明部分);
]<
变量说明部分>
;
<
语句部分>
常量说明部分>
=const<
常量定义表>
=<
,<
常量定义>
=<
标识符>
常量>
变量说明>
标识符表>
=int
字母>
数字>
语句>
|<
赋值语句>
条件语句>
循环语句>
读语句>
写语句>
复合语句>
={<
}
表达式>
条件>
关系运算符>
项>
加法运算符>
因子>
乘法运算符>
|(<
)
无符号整数>
数字序列>
=+|-
=*|/
|>
|!
=|>
=|<
=|==
=if(<
)<
else<
=while(<
)do<
=scanf(<
格式控制表>
标识符地址表>
=printf(<
)
=a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z
=0|1|2|3|4|5|6|7|8|9
3、实现功能:
(1)词法分析
扫描源程序,根据词法规则,识别单词,填写相应的符号表。
(2)语法分析
对由源程序作语法分析,确定是否属于C语言小子集,同时揭示出程序的内在结构。
(3)语法错误检查
根据C语言小子集的文法规则设置检测手段,通过查错子程序或一些查错语句,报告源程序出错位置、性质等,直至整个程序结束为止。
(4)语义分析与目标代码生成
在语法分析的基础上,进行语义分析,生成源程序的目标代码。
源程序的目标代码可以建立在一个假想的处理机(虚拟机)上,也可以以所学的汇编语言为基础。
源程序样本:
main()
{inta,b,x,y,max;
a=10;
while(a>
0)
{b=a*a;
a=a-1;
x=a+b;
y=b+b;
if(x>
y)max=x
elsemax=y
附录:
PL0编译程序的实现
1.PL0概述
PL0语言是一种类PASCAL语言,是教学用程序设计语言,它比PASCAL语言简单,作了一些限制。
PL0的程序结构比较完全,赋值语句作为基本结构,构造概念有顺序执行、条件执行和重复执行,分别由BEGIN/END、IF和WHILE语句表示。
此外,PL0还具有子程序概念,包括过程说明和过程调用语句。
在数据类型方面,PL0只包含唯一的整型,可以说明这种类型的常量和变量。
运算符有+,-,*,/,=,<
>
,>
=,>
=,(,)。
说明部分包括常量说明、变量说明和过程说明。
2.PL0语言的文法规则
.<
][<
]{<
过程说明部分>
}<
{,<
{<
=var<
过程首部>
=procedure<
=begin<
{;
}end
当型循环语句>
过程调用语句>
|
空语句>
|odd<
=[+|-]<
=|=
=if<
then<
=call<
=while<
do<
=read(<
})
=write(<
3.PL0编译程序的设计思想
在本上机实习中,我们给出用PASCAL语言编写的PL0的编译程序,要求学生先读懂它,然后再用自己熟悉的高级语言改写它,能力强的同学可以按照所学知识,自行设计实现方案。
4.PL0编译程序的功能
(1)语法分析对由PL/0语言编制的程序作语法分析,确定是否属于PL/0语言,同时揭示出程序的内在结构。
(2)语法错误检查根据PL/0语言的文法规则设置检测手段,通过查错子程序和一些查错语句,报告源程序出错位置、性质等,直至整个程序结束为止。
(3)生成目标代码PL/0语言的目标代码是建立在一个假想的处理机上,此处理机称为PL/0处理机。
(4)执行目标代码PL/0处理机是一种假想的处理机,其目标代码不能在实际的机器上执行,故此编译程序设置了一个子程序,它对PL/0语言的目标代码逐条解释执行,最后得出所需结果。
5.PL/0编译程序的有关过程及函数
在PL/0语言的编译文本中,除了常量和变量说明外,共有18个相互嵌套或并列的过程(或函数)。
现对这些过程和函数作扼要说明。
(1)error(n):
其功能是报告PL/0源程序的出错信息。
n为错误类型号,共可查出36种错误。
(2)getsym:
词法分析子程序。
其功能为读单词。
getch:
读字符子程序。
它嵌套于读单词子程序中。
(3)gen(x,y,z),伪代码生成子程序。
其功能是根据不同的x、y、z生成不同的伪代码。
x表示指令码,y表示层差,z表示位移量或数。
(4)test(sl,s2,n):
查错子程序。
其功能是检测源程序中的语法错误。
(5)block(1ev,tx,fsys):
分程序处理模块。
其功能为对分程序进行处理。
lev表示层差,tx表示标识符表的下标,fsys是符号集,表示可能出现的符号。
分程序处理模块是整个编译程序的核心,它包含以下的过程和函数。
enter(k):
其功能是造符号表table。
k表示符号的类型,其取值范围是(constant,variable,proceable),即此子程序对常量、变量和过程造符号表table,以备检查标识符是否说明过。
position(id):
其功能是查符号表,它是一个函数。
id是所检查的标识符,若查到则给出标识符id在标识符表中的位置,否则给0。
constdeclaration:
常量造表子程序。
其功能是为常量造一张常量表,内填常量名、常量值。
它通过调用子程序enter(k)完成,此时k=constant。
vardeclaration:
变量造表子程序。
其功能是为变量造一张变量表,内填变量名、所处层号。
它也是通过调用子程序enter(k)来完成的,此时k=variable。
listcode,打印(伪)代码子程序。
其功能是输出生成的目标代码。
statement(fsys):
语句处理子程序。
其功能是处理语句,它是递归调用的核心部分。
其递归调用顺序如下:
expression(fsys):
处理算术表达式子程序;
term(fsys):
处理项子程序;
condition(fsys):
处理因子子程序。
(6)interpret,执行目标代码子程序。
其功能是对编译过程中生成的目标代码(伪代码)逐条解释执行。
base(l):
提供计算静态链信息子程序。
它为过程调用提供调用所需的基地址。
整个PL/0编译程序通过主程序调用分程序处理模块block,再通过block递归调用上述的子程序,达到对PL/0语言的程序进行编译的目的。
6.编译步骤
程序中用数组word存贮PL/0语言的所有保留字。
保留字有begin、call、const、do、end、if、odd、procedure、read、then、var、while、write;
用数组swym存贮保留字所对应的符号表symbol中的符号;
用数组ssym存贮关系运算符及特殊符号+、-、*、/、(、)、=、,、<
、>
及;
所对应的符号表symbol中的符号;
用数组mnemonic存贮目标代码的指令码部分。
其具体步骤如下:
在主程序中给出编译程序所需的初始值。
置字符字数cc、行长ll、代码分配下标cx、错误个数err等为0。
调getsym读单词;
调block模块,进入分程序处理;
判断所读单词是否为常量说明符号constsym,是则转4),否则转5)。
读单词并作常量说明处理;
查所读单词是否为“,”,是则重复本步;
否则判断此单词是否为“;
”,是则读单词,否则给出出错信息。
进行下一步;
所读单词是否为变量说明符号variable,是则读单词并作变量说明处理,再读单词并判断是否为“,”,是则重复本步;
cxl:
=cx,并生成jmp0,0指令,判断所读单词是否为过程说明符号proceduresym,是则读单词转7),否则转11);
判断所读单词是否为标识符,是则转8),否则给出出错信息再进行下一步;
标识符填表,再读单词。
判断所读单词是否为“;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 上机 实习 指导书