《编译原理实验1报告.doc》由会员分享,可在线阅读,更多相关《编译原理实验1报告.doc(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、石 家 庄 铁 道 大 学实 验 报 告课程名称编译原理 信息 学院(系) 班级:信1201-2班 试验者姓名 董龙洋 学号 实验日期 2014 年 12 月01 日评分 教师签名 实验项目名称: 实验一 词法分析一、实验目的 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。二、实验要求编制一个读单词过程,源程序为一个文件,读取该文件,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、界符五大类。并依次输出各个单词的内部编码及单词符号自身值。单词的内部编码如下:1、保留字:if、int
2、、for、while、do、return、break、continue;单词种别码为1;2、标识符:除保留字外的以字母开头,后跟字母、数字的字符序列;单词种别码为2;3、常数为无符号整形数;单词种别码为3;4、运算符包括:+、-、*、/、=;单词种别码为4;5、分隔符包括:,、;、(、); 单词种别码为5。三、预习提示1、词法分析器的功能和输出格式词法分析器的功能是输入源程序,输出单词符号。词法分析器的单词符号常常表示成以下的二元式(单词种别码,单词符号的属性值)。本实验中,采用的是一类符号一种种别码的方式。2、各类单词的文法| + | - | * | / | = , | ; | ( | )
3、| | 3、模块结构参照教材图2.5词法分析过程GETSYM。四、实验过程和指导1、准备(1) 课本有关章节;(2) 编制好程序;(3) 准备多组测试数据。2、程序思路(仅供参考):在词法分析中,自文件头开始扫描源程序字符,一旦发现符合“单词”定义的源程序字符串时,将它翻译成固定长度的单词内部表示,并填入适当的信息表。经过词法分析后,源程序字符串(源程序的外部表示)被翻译成具有等长信息的单词串(源程序的内部表示),并产生两个表格:常数表和标识符表,它们分别包含了源程序中的所有常数和所有标识符。(1) 定义部分:定义常量、变量、数据结构。(2) 初始化:从文件将源程序全部输入到字符缓冲区中。(3
4、) 取单词前:去掉多余空白。(4) 取单词:利用实验一的成果读出单词的每一个字符,组成单词,分析类型。(5) 显示结果。3、为了能设计好程序,注意以下事情:(1) 模块设计:将程序分成合理的多个模块(函数),每个模块做具体的同一事情。(2) 写出(画出)设计方案:模块关系简图、流程图、全局变量、函数接口等。(3) 编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。4.源程序#include #include #include#include #include#include char *table6= ,int,if,then,else,return,TOKEN20; /定义保留字 i
5、nt lookup(char *TOKEN) /保留字匹配函数 int m,i; for(i=1;i | ch = | ch = !| ch = =)return 1; return 0; int is_fengefu(char ch) if(ch = , | ch = ; | ch = | ch = | ch = ( | ch = ) return 1; return 0; void out(int c,char *TOKEN) /输出函数 printf(%d, %s)n,c,TOKEN); void scanner(FILE *fp) /扫描函数 char TOKEN20=0; char
6、ch; int i, c; ch=fgetc(fp); /获取字符,指针fp并自动指向下一个字符 if(isalpha(ch) /判断该字符是否是字母 TOKEN0=ch; ch=fgetc(fp); i=1; while(isalnum(ch)| ch = _) /判断该字符是否是字母或数字或下划线 TOKENi+ = ch; ch=fgetc(fp); c = lookup(TOKEN); if(c) out(1,TOKEN); else out(2,TOKEN); fseek(fp,-1,1); else if(isdigit(ch) TOKEN0=ch; ch=fgetc(fp); i
7、=1; while(isdigit(ch) | ch = .) /判断该字符是否数字 TOKENi+ = ch; ch=fgetc(fp); out(3,TOKEN); fseek(fp,-1,1); else if(is_yunsuanfu(ch) TOKEN0 = ch; ch = fgetc(fp); if (ch = =) TOKEN1 = ch; out(4,TOKEN); else out(4,TOKEN); fseek(fp,-1,1); else if(is_fengefu(ch) TOKEN0 = ch; out(5,TOKEN); int main() char ch; F
8、ILE *fp; if(fp=fopen(1.txt,r)=NULL) /读取文件内容,并返回文件指针,该指针指向文件的第一个字符 fprintf(stderr,error opening.n); exit(1); do ch=fgetc(fp); if(ch=#) /文件以#结尾,作为扫描结束条件 break; if(ch= |iscntrl(ch) /如果是空格,自动跳到下个字符 scanner(fp); else fseek(fp,-1,1); /如果不是空格,则回退一个字符并扫描 scanner(fp); while(ch!=#); return(0); 5. 实验截图五、 实验总结通过本次实验,进一步体会词法分析的过程及步骤,当然还有设计词法分析程序的算法思想。充分理解词法分析的原理,扫描分类的过程。