编译原理课程设计Word文件下载.docx
- 文档编号:22410203
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:12
- 大小:216.63KB
编译原理课程设计Word文件下载.docx
《编译原理课程设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《编译原理课程设计Word文件下载.docx(12页珍藏版)》请在冰豆网上搜索。
在学习《编译原理》课程设计中,结合各章节的构造编译程序的基本理论,总共用20学时的时间完成课程设计。
要求用C或java语言描述及上机调试,实现词法分析器的设计,是将理论与实际应用结合起来,受到软件设计等开发过程的全面训练,从而提高我们的软件开发的能力。
二、实验要求
词法分析器的设计:
状态转换图,简称转换图,是设计词法分析器的有效工具。
状态转换图是有限有向图,图中的结点代表状态,结点间的有向边代表状态之间的转换关系,有向边上标记的字符表示状态转换的条件。
状态的数量是有限的,其中必有一个初始状态,若干个终止状态。
大部分终止状态可对应一类单词符号的成功识别,所以也被成为识别状态。
在识别状态下,可以给出相应单词的类别编码和属性值。
某些终止状态是在多识别了一个字符后才成为识别状态的,对于这种情况,多识别的字符应予以退回,在终态上标以“*”作为区别。
有了状态转换图后,就可以方便地设计和实现词法分析器了。
下面以一个简单的程序语言的词法分析器为例作为介绍。
表中列出了该语言的所有单词符号及其编码,其中助记符是用于方便书写和记忆的。
2.1待分析的简单词法
1、标识符
用来命名程序中出现的变量、数组、函数、过程、标号等,通常是一个字母开头的字母数字串,如length,nextch等。
2、基本字
也可以成为关键字或保留字。
如if,while,for,do,goto等。
他们具有标识符的形式,但他们不是由用户而是由语言定义的,其意义是约定的。
多数语言中规定,他们不能作为标识符或者标识符的前缀,即用户不能使用它们来定义用户使用的名字,故我们称它为保留字,这些语言如Pascal和C等。
但也有的语言允许将基本字作为标识符或者标识符的前缀,这类语言如Fortran等。
3、常数
包括各种类型的常数,如整型、实型、字符型、布尔型等。
如:
5、3.1415926、’a’、TRUE等都是常数。
4、运算符
算术运算符+、-、×
、÷
;
关系运算符<
<
=,>
>
=,==,!
=等。
5、界符
如’,’、’;
’等界符。
2.2各种单词符号对应的简单编码
表2.2-1
2.3词法分析程序的功能
1.具备预处理功能。
将不翻译的注释等符号先滤掉,只保留要翻译的符号串,即要求设计一个供词法分析调用的预处理子程序;
2.能够拼出语言中的各个单词;
3.将拼出的标识符填入符号表;
4.返回(种别码,属性值)。
2.4识别语言单词的状态转换图
图2.4-1
三、词法分析程序的算法思想
词法分析子程序名为getsyn,功能是从源程序中读出一个单词符号(token),把它的信息放入全局变量syn、id和num中,语法分析器需要单词时,直接从这三个变量中获得。
(语法分析器每次用完这三个变量的值就立即调用getsyn子程序获取新的单词供下一次使用。
而不是在需要新单词时才调用getsyn过程。
)getsyn过程通过反复调用getch子过程从源程序过获取字符,并把它们拼成单词。
getch过程中使用了行缓冲区技术以提高程序运行效率。
词法分析器的分析过程:
调用getsyn时,它通过getch过程从源程序中获得一个字符。
如果这个字符是字母,则继续获取字符或数字,最终可以拼成一个单词,查保留字表,如果查到为保留字,则把syn变量赋成相应的保留字类型值;
如果没有查到,则这个单词应是一个用户自定义的标识符(可能是变量名、常量名或是过程的名字),把syn置为ident,把这个单词存入id变量。
查保留字表时使用了二分法查找以提高效率。
如果getch获得的字符是数字,则继续用getch获取数字,并把它们拼成一个整数,然后把syn置为number,并把拼成的数值放入num变量。
如果识别出其它合法的符号(比如:
赋值号、大于号、小于等于号等),则把syn则成相应的类型。
如果遇到不合法的字符,把syn置成nul。
图3.1-1
四、运行结果
4.1正确的输入(test.in)及结果
1.hstBeginx:
=10;
hstIfx>
0;
hstThenx:
=5/x-2*3;
hstEnd#
2.figures10and11saidOtherindicators
3.figures10and11saidOperators
图4.1-1
图4.1-2
4.2有误的输入及结果
五、源程序
#include<
stdio.h>
string.h>
conio.h>
ctype.h>
#definegetchgetchar
charprog[80]={'
\0'
};
chartoken[8];
charch;
intsyn;
intn;
intsum;
intm,p;
char*rwtab[6]={"
hstBegin"
"
hstIf"
hstThen"
hstWhile"
hstDo"
hstEnd"
voidscaner(){
m=0;
sum=0;
for(n=0;
n<
8;
n++)
token[n]='
;
ch=prog[p++];
while(ch=='
'
)
if(isalpha(ch)){
while(isalpha(ch)||isdigit(ch)){
token[m++]=ch;
}
token[m++]='
ch=prog[p--];
syn=10;
6;
if(strcmp(token,rwtab[n])==0){
syn=n+1;
break;
}}
else
if(isdigit(ch)){
while(isdigit(ch)){
sum=sum*10+ch-'
0'
syn=3111;
switch(ch){
case'
<
'
:
m=0;
token[m++]=ch;
ch=prog[p++];
if(ch=='
>
){
syn=3119;
elseif(ch=='
='
syn=3122;
else{
syn=3120;
syn=3123;
syn=3127;
syn=3117;
+'
syn=3113;
token[0]=ch;
break;
-'
syn=3114;
*'
syn=3115;
/'
syn=3116;
)'
syn=3118;
syn=3124;
syn=3125;
('
syn=3126;
#'
syn=3100;
case'
{'
syn=3128;
}'
syn=3129;
default:
syn=-1;
intmain()
{
p=0;
printf("
\npleaseinputstring:
\n"
);
do{
ch=getchar();
prog[p++]=ch;
}while(ch!
do{
scaner();
switch(syn){
case3111:
(%d,%d)\n"
syn,sum);
case-1:
\nERROR;
(%d,%s)\n"
syn,token);
}while(syn!
=0);
getch();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 课程设计