编译原理课程设计报告词法语法分析器.docx
- 文档编号:5604409
- 上传时间:2022-12-28
- 格式:DOCX
- 页数:17
- 大小:212KB
编译原理课程设计报告词法语法分析器.docx
《编译原理课程设计报告词法语法分析器.docx》由会员分享,可在线阅读,更多相关《编译原理课程设计报告词法语法分析器.docx(17页珍藏版)》请在冰豆网上搜索。
编译原理课程设计报告词法语法分析器
编译原理课程设计
CourseDesignofCompiling
(课程代码3273526)
半期题目:
词法和语法分析器
实验学期:
大三第二学期
学生班级:
2014级软件四班
学生学号:
18
学生姓名:
何华均
任课教师:
丁光耀
信息科学与技术学院
课程设计1-C语言词法分析器
1.题目
C语言词法分析
2.内容
选一个能正常运行的c语言程序,以该程序出现的字符作为单词符号集,不用处理c语言的所有单词符号。
将解析到的单词符号对应的二元组输出到文件中保存
可以将扫描缓冲区与输入缓冲区合成一个缓冲区,一次性输入源程序后就可以进行预处理了
3.设计目的
掌握词法分析算法,设计、编制并调试一个词法分析程序,加深对词法分析原理的理解
4.设计环境(电脑语言环境)
语言环境:
C语言
CPU:
i7HQ6700
内存:
8G
5.概要设计(单词符号表,状态转换图)
词法分析器的结构
词法分析程序的功能:
输入:
所给文法的源程序字符串。
输出:
二元组(syn,token或sum)构成的序列。
词法分析程序可以单独为一个程序;也可以作为整个编译程序的一个子程序,当需要一个单词时,就调用此法分析子程序返回一个单词.
为便于程序实现,假设每个单词间都有界符或运算符或空格隔开,并引入下面的全局变量及子程序:
1)ch存放最新读进的源程序字符
2)strToken存放构成单词符号的字符串
3)Buffer字符缓冲区
4)structkeyType存放保留字的符号和种别
源程序
输入缓冲区
预处理子程序
扫描缓冲区1
扫描缓冲区2
词法分析子程序
返回一个单词
调用
数据
待分析的简单词法
(1)保留字
break、case、char、const、int、do、while…
(2)运算符和界符
=、+、-、*、/、%、,、;、(、)、、#
各种单词符号对应的种别码
单词符号
种别码
单词符号
种别码
ID
0
sizeof
24
INT
1
static
25
auto
2
struct
26
break
3
switch
27
case
4
typedef
28
char
5
union
29
const
6
unsigned
30
continue
7
void
31
default
8
volatile
32
do
9
while
33
double
10
=
34
else
11
+
35
enum
12
-
36
extern
13
*
37
float
14
/
38
for
15
%
39
goto
16
40
if
17
;
41
int
18
(
42
long
19
)
43
register
20
44
return
21
clear
45
short
22
#
46
signed
23
lettet(letter|digit)*
47
dightdight*
48
状态转换图
6.详细设计(数据结构,子程序)
算法思想:
首先设置3个变量:
①strToken用来存放构成单词符号的字符串;②ch用来字符;③structkeyType用来存放单词符号的种别码。
扫描子程序主要部分流程如下图所示。
子程序结构:
子程序名
功能
GETCHAR()
读一个字符到ch中
GETBC()
读一个非空白字符到ch中
CONCAT()
把CHAR中字符连接到strToken之后
LETTER()
判断CHAR中字符是否为字母
DIGIT()
判断ch中字符是否为数字
RESERVE()
用strToken中的字符串查找保留字表,并返回保留字种别码,若返回零,则非保留字
RETRACT()
把CHAR中字符回送到缓冲区
7.程序清单
eyname)==0)
returnKey[i].value;
return0;
}
voidRetract()
alue;
}
elseif(ch>='0'&&ch<='9'){
ConCat();
GetChar();
while(Digit()){
ConCat();
GetChar();
}
Retract();
strcpy,strToken);
=1;
}
else{
ConCat();
strcpy,strToken);
=Reserve();
}
returntempkey;
}
/*
主函数
*/
intmain(){
行结果
E:
/作业/编译原理/
运行结果
九、实验体会
通过本次次法分析设计实验,我加深了对词法分析过程的理解。
并在实际的设计过程深入的了解了编译原理思想。
对编译原理课程有了更深的理解
课程设计二:
设计简单的语法分析器
一、题目
设计简单的语法分析器
二、设计内容
用算符优先分析方法设计一个分析解释程序,对输入的赋值语句、输出语句、清除语句进行词法分析、语法分析、表达式求值并存储于指定变量中;若存在错误,提示错误相关信息。
三、设计目的
了解掌握算符优先分析的基本方法、内容;
四、设计环境
语言环境:
C语言
CPU:
i7HQ6700
内存:
8G
五、概要设计
设计思路
语法分析的任务:
把单词符号作为基本单位,分析程序是否为合法的程序.
算符优先分析法是自下而上的语法分析方法,即根据文法,对输入字串进行归约,若能正确地归约为文法的初始符号,则表示输入字串是合法的.主要研究对输入的赋值语句、输出语句、清除语句进行词法分析、语法分析、表达式求值并存储于指定变量中;若存在错误,提示错误相关信息。
文法表示:
S→v=E|E|clear
E→E+T|E-T|T
T→T*F|T/F|F
F→(E)|v|c
单词种别码设计
符号
种别码
=
1
2
+
3
-
4
*
5
/
6
(
7
)
8
v
9
c
10
clear
11
#
12
N
13
六、详细设计
变量及函数说明
变量及函数名
表示内容及操作
intpriority[NUM][NUM]
优先关系矩阵
structWordType
单词种别码结构
structVarWord
变量表中的元素结构
mainStack
归约栈
wordStack
单词串
GetwordStack()
输入串转化成单词串
GetWord()
从单词串中取单词
ClearwordStack()、ClearmainStack()
清空单词串和归约栈
CheckvarTable(chara[])
查看变量在变量表中的位置
AddvarTable(VarWorda)
变量表添加变量
InitmainStack()
初始化归约栈
AddmainStack(WordTypea)
归约栈添加
Handle()
归约处理程序
MainHandle()
归约子程序
七、程序清单
eyname)==0)
returnKey[i].value;
return0;
}
voidRetract()alue;
}
elseif(ch>='0'&&ch<='9'){
ConCat();
GetChar();
while(Digit()){
ConCat();
GetChar();
}
Retract();
strcpy,strToken);
=1;
}
else{
ConCat();
strcpy,strToken);
=Reserve();
}
returntempkey;
}
boolGetwordStack(){
inti;
=0;
keyTypetemp;
while(strlen(buffer)){
temp=ReturnWord();ord,;
[].value=10;
}
elseif==0)ord,;
[].value=9;
}
else{
for(i=0;i if(strcmp,wordType[i].word)==0)arname)==0) returni; elseif(i==M-1) return-1; } /* 添加变量 */ voidAddvarTable(VarWorda){ []=a; ++; } /* 初始化归约栈 */ voidInitmainStack() { [0]=wordType[12]; =1; } /* 添加归约栈 */ voidAddmainStack(WordTypea) { []=a; ++; } /* 归约 */ boolHandle() { inti; alue==10){ [-1].value=13; } alue==9){ [-1].value=13; i=CheckvarTable[-1].word); if(i<0){ printf("\n变量%s未定义! ",[-1].word); returnfalse; } else strcpy[-1].word,[i].value); } alue==1){ if[-3].value==9){ i=CheckvarTable[-3].word); if(i<0){ VarWordtemp; strcpy,[-3].word); strcpy,[-1].word); =true; AddvarTable(temp); } else strcpy[i].value,[-1].word); strcpy[-3].word,[-1].word); [-3].value=13; } elseif[-3].value==13) strcpy[-3].word,[-1].word); =-2; } alue==3){ inta,b; a=atoi[-1].word); b=atoi[-3].word); a=a+b; itoa(a,[-3].word,10); =-2; } elseif[-2].value==5){ inta,b; a=atoi[-1].word); b=atoi[-3].word); a=a*b; itoa(a,[-3].word,10); =-2; } alue==2&&[-1].value==13&&[-2].value==12){ printf("\n表达式的值为%s",[-1].word); =0; } alue==12&&[0].value==12) =-2; returntrue; } boolMainHandle(){ while if(priority[[-1].value][[0].value]! =1) AddmainStack(GetWord()); else{ if{ ord,[i].value); Handle(); } break; } if MainHandle(); returntrue; } /* 主函数 */ intmain(){ intok=1; WordTypetemp; intii=0; while(ok){ printf("\n"); printf("输入第%d语句串: ",++ii); scanf("%s",buffer); printf("单词串: "); if(! GetwordStack()) return0; for(inti=0;i<;i++) printf("(%s,%d)",[i].word,[i].value); printf("\n当前归约栈: "); InitmainStack(); MainHandle(); } printf("结束\n"); return0; } 八、运行结果 九、实验体会 通过本次语法分析设计实验,我加深了对语法分析过程的理解。 并在实际的设计过程深入的了解了编译原理思想。 对编译原理课程有了更深的理解
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 课程设计 报告 词法 语法 分析器