- 1、本文档共11页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
武汉工程大学
计算机科学与工程学院
《编译原理》实验报告[1]
专业班级
实验时间
2010年11月12日
学生学号
实验地点
403
学生姓名
指导教师
实验项目
词法分析器设计
实验类别
设计性
实验学时
4
实 验 目 地 及 要 求
实验目地:
用C语言对一个简单语言地子集编制一个一遍扫描地编译程序,以加深 对编译原理地理解,掌握编译程序地实现方法和技术 ?
成绩评定表
类 另y
评分标准
分值
得分
合计
上机表现
按时出勤、遵守纪律 认真完成各项实验内容
30分
报告质量
程序代码规范、功能止确 填写内容完整、体现收获
70分
说明:
评阅教师:日期:2010年月曰
实验内容
实验要求:
1.1待分析地简单语言地词法
(1) 关键字:
Begi n if then while do end (所有关键字都是小写)
(2) 运算符和界符:
:=+ - * / < <= <> > >= = ; ( ) #
(3)其他单词是标识符(ID )和整型常数(NUM),通过以下正规式定义:
ID=letter (letter|digit )*
NUM=digit digit *
(4)空格由空白、制表符和换行符组成.空格一般用来分隔ID、NUM运
算符、界符和关键字、词法分析阶段通常被忽略
1.2各种单词符号对应地种别码
单词符号
种别码
单词符号
种别码
begin
1
17
if
2
:=
18
the n
3
<
20
while
4
<>
21
do
5
<=
22
end
6
>
23
letter(letter|digit)*
10
>=
24
digit digit*
11
=
25
+
13
26
-
14
(
27
*
15
)
28
/
16
#
0
1.3词法分析程序地功能
输入:所给文法地源程序字符串.
输出:二元组(syn,token或sum)构成地序列.
其中:syn为单词种别码;
toke n 为存放地单词自身字符串;
sum 为整型常数.
例如:对源程序
begi n x:=9; if x>0 then x:=2*x+1/3; end #
地源文件,经词法分析后输出如下序列:
(1, begin )(10, x)( 18,: =)( 11, 9)( 26,;)( 2, if )……
1.4词法分析程序地算法思想
算法地基本任务是从字符串表示地源程序中识别出具有独立意义地单词符号,其基 本思想是根据扫描到地单词符号地第一个字符地种类,拼出相应地单词符号 .
1.主程序示意图
主程序示意图如图1-1所示.其中初值包括如下两个方面:
(1)关键字表地初值
关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当 扫描程序识别出标识符时,查关键字表?如能查到匹配地单词,则该单词为关键字,否则 为一般标识符.关键字表为一个字符串数组,其描述如下:
char *rwtab[6]= {“ begin ”,” if ” , ” then ”,” while ” , ” do” , ” end”};
置初值
调用扫描子程序
输岀单词二元组
结束
图1-1词法分析主程序示意图
(2)程序中需要用到地主要变量为 syn, token和sum.
2.扫描子程序地算法思想
首先设置3个变量:token用来存放构成单词符号地字符串;sum用来存放整型单词;
syn用来存放单词符号地种别码.扫描子程序主要部分流程如图1-2所示.
图1-2词法分析程序流程
词法分析程序地C语言程序
#in elude "stdio.h" /*
#in elude "stri ng.h" /*
#in clude "coni o.h" /*
#i nclude "ctype.h" /*
char prog[80]={'\0'},
toke n[8]; /*
定义I/O库所用地某些宏和变量*/
定义字符串库函数*/
提供有关屏幕窗口操作函数 */
分类函数*/
存放构成单词符号地字符串 */
char ch;
int syn,
/*
存放单词字符地种别码 */
n,
sum,
/*
存放整数型单词*/
m,p;
/*p
是缓冲区prog地指针,m是token地指针*/
char *rwtab [ 6]={"begi n","if',"the n","while","do","e nd"}; void sca ner(){
m=0;
sum=0;
for(n=0;n<8;n++)
toke n[n]='\0:
ch=prog[p++];
while(ch=='')
ch=prog[p++];
if(isalpha(ch)) /*ch 为字母字符 */{
while(isalpha(ch)||isdigit(ch)) /*ch 为字母
文档评论(0)