编译原理实验一_源程序的预处理及词法分析程序设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一词法分析程序设计
(6学时)
一、实验目的
设计并实现一个包含预处理功能的词法分析程序,加深对编译中词法分析过程的理解。
二、实验要求
1、实现词法分析功能
输入:所给文法的源程序字符串。
输出:二元组(syn,token)构成的序列。
其中,
syn为单词种别码。
Token为存放的单词自身字符串。
具体实现时,可以将单词的二元组用结构进行处理。
2、待分析的C语言子集的词法
1)关键字
main if then while do static int double struct break else long switch case typedef char return const float short
continue for void default sizeof do
所有的关键字都是小写。
2)运算符和界符
+ - * / < <= > >= = ; ( )
3)其他标记ID和NUM
通过以下正规式定义其他标记:
标识符 ID→letter(letter|digit)*
无符号整数 NUM→digit digit*
字母 letter→a|…|z|A|…|Z
数字 digit→0|…|9…
4)空格由空白、制表符和换行符组成
空格一般用来分隔ID、NUM、专用符号和关键字,词法分析阶段通常被忽略。
4、各种单词符号对应的种别码
表1 各种单词符号的种别码
单词符号种别码单词符号种别码
main 1 ; 41
if 2 ( 42
else 3 ) 43
while 4 int 7
do 5 double 8
static 6 struct 9
ID (标识符)25 break 10
NUM (整数) 26 else 11
+ 27 long 12
- 28 switch 13
* 29 case 14
/ 30 typedef 15
: 31 char 16
:= 32 return 17
< 33 const 18
<> 34 float 19
<= 35 short 20
> 36 continue 21
>= 37 for 22
= 38 void 23
default 39 sizeof 24
do 40
5、词法分析程序的主要算法思想
算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到的单词符号的第一个字符的种类,拼出相应的单词符号。
1. 主程序示意图
主程序示意图如图1所示。
图1 词法分析主程序示意图
其中初值包括如下两方面:
(1)关键字表初值
关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。
如能查到匹配的单词,则该单词为关键字,否则为一般标识符。
关键字表为一个字符串数组,其描述如下:
char * rwtab[27]={“main”,”if”,”else”,”while”,”do”,”
static”,”int”,”double”,”struct”,”break”,”else”,”long”,”switch”, ”case”,”typedef”,”char”,”return”,”const”,”float”,”short”,
”continue”,”for”,”void”,”default”,”sizeof”,”do”};
(2) 程序中需要用到的主要变量:syn,token和sum。
2. 扫描子程序的算法思想
设置三个变量:
int syn: 用来存放单词符号的种别编码。
char token[255]=""; 单词缓冲区,用来存放构成单词符号的字符串,
int i=0; /*
char input[1024];/*输入缓冲区*/
3. 状态转换图
三、实验报告要求
1.写出编程思路、源代码(或流程图);
2.写出上机调试时发现的问题,以及解决的过程;
3.写出你所使用的测试数据及结果;
4.谈谈你的体会。
5.上机6小时,完成实验报告2小时。