编译原理 词法分析器 流程代码解析
更新时间:2023-08-29 12:20:01 阅读量: 教育文库 文档下载
- 编译原理推荐度:
- 相关推荐
编译原理
实 验 报 告
课程名称 实验项目名称
学号 姓名
编译原理实验 词法分析器 XXXXXXXXXX XXX 计算机
科学与技术学院
班级 专业
XXXXXX 计算机 科学与技术 XXX
学生所在学院 指导教师
实验室名称地点
XXXXXX大学
计算机科学与技术学院
一、实验概述
1. 实验名称 【词法分析器】 2. 实验目的
! 理解编译器的工作原理; ! 掌握编译器的构造方法; ! 掌握词法分析器生成工具的用法; ! 加深对编译器词法分析阶段的理解。 3. 实验类型 【设计】 4. 实验内容
! 对给定的程序通过词法分析器能够识别一个个单词符号,并以二元式显示; ! 可以将要分析的程序保存到文件中进行读取; ! 删除无用的空白字符、回车符、及其它非实质性符号。
二、实验环境
! 实验使用的操作系统:Window XP ! 编程环境:Visual C++ 6.0
三、实验过程
1. 原理分析
词法分析器又称扫描器,词法分析程序的主要任务是从构成源程序的字符串
中识别出一个个具有独立意义的语法单位(单词)。词法分析程序的输入为字符串,而输出为提供给语法分析的单词串。为了能够从源程序文本中分离出这些单词,词法分析程序首先必须对源程序文本进行编辑,例如消除文本中的注释,空格,换行符以及其他一切对语法分析和代码生成均无关的信息。其次还需要区别单词究竟是标识符、数字、运算符或其他符号。最后还应该用文法的形式将它们表示出来,并存储在符号表中。词法分析器主要特点是不依靠语法,而只依靠词法,即处理一个单词时不依赖于外部单词的信息,因此词法分析器一般都很简单。当然,对某些语言在作词法分析时,在有些情况下不得不往前查看多个字符,有时还要做一些特殊处理,还有一些在词法分析中处理不了的,要留到语法分析中进行处理。
2. 设计思路
本算法主要利用状态转换图生成一个词法分析器,对输入的程序进行词法分析,并将分析得到的单词造表。其中关键字表和界限符表的大小是由高级语言的子集决定的,可以用数组装载;而标识符表和常数表的大小取决于输入的待分析程序中的变量、过程名、常数的个数,所以要用指针组成动态链表来装载。当然为了方便,我们也把它定义成数组处理。算法根据C语言单词符号类型不同,现将其分为关键字、普通标示符、常数和界符这四类,为简化程序判定复杂程度,现引入界符一词,所谓界符就是就是成对出现的符号,比如{ }、[ ]、" " 、' ' 等等。扫描字符串过程以遍历单词类型的形式循环进行,即在未识别出具有独立意
义的最小语法单位并且尚未判定所扫描的字符串无效,无法识别之前,将所扫描的字符串先统一集中存储在一个字符串数组之中,而后,每识别出一个单词,若这个单词的类型是关键字、普通标示符、常数或界符中之一,那么就将此单词以文字说明的形式输出。
3. 流程图:
4. 状态转换图:
5. 符号串分类表: 关键字(Keywords)
int char float double short long if else switch case default for while do void return continue break const goto volatile static
unsigned signed struct enum union auto register extern sizeof typedef asm bool explicit export friend inline mutable operator template typeid virtual warch_t delete namespace typename using const_castdynamic_cast reinterpret_cast static_cast class new public private protected this try throw catch (true false)
标识符(Identifiers) 1) 标识符由字母(A-Z,a-z)、数字(0-9)、下划线“_”组成,并且首字符不能是数字,但可以是字母或者下划线。例如,正确的标识符:abc,a1, 2) 不能把C语言关键字作为标识符,例如if ,define ,for, while等.
3) 标识符长度是由机器上的编译系统决定的,一般的限制为8字符
(注:8字符长度限制是C89标准,C99标准已经扩
充长度,其实大部分工业标准都更长)。
4) 标识符对大小写敏感,即严格区分大小写。一般对变量名用小写,符号常量命名用大写。
5)标识符命名应做到“见名知意”,例如,length(表示长度),sum(表示求和),pi(表示圆周率)……
常数(Constans)
1)规定的数量与数字。 2)一定的重复规律。 3)一定之数或通常之数。 4)一定的次序。
5)常数是具有一定含义的名称,用于代替数字或字符串,其值从不改变。
运算符(Operators)
1)算术运算符:* - + /
2)关系运算符: > < == != >= <= 3)逻辑运算符:! && || 4)位运算符:<< >> ~ | ^ & 5)赋值运算符:=及扩展赋值运算符 6)条件运算符:?: 7)逗号运算符:, 8)指针运算符:*和& 9)求字节数运算符:sizeof
10)强制类型转换运算符:(类型) 11)分量运算符:. -> 12)下标运算符:[ ]
13)其他:如函数调用运算符:()
界符(Delimiters)
6. 实验代码及注释
#include<string.h> #include<stdio.h> #include<stdlib.h> #include<ctype.h>
//定义关键字
char *Key[10]={"main","void","int","char","printf","scanf","else","if","return"}; char Word[20],ch; // 存储识别出的单词流
int IsAlpha(char c) { //字母判断 }
int IsNum(char c){ //数字判断 }
int IsKey(char *Word){ //识别关键字函数 int m,i;
for(i=0;i<9;i++){
if((m=strcmp(Word,Key[i]))==0) {
if(i==0)
return 2; return 1;
if(c>='0'&&c<='9') return 1; else return 0;
if(((c<='z')&&(c>='a'))||((c<='Z')&&(c>='A'))) return 1; else return 0;
一些成对出现的符号,例如 [ ]、{ }、“ ”等
}
}
}
return 0;
void scanner(FILE *fp){ //扫描函数
else //开始判断的字符不是字母
if(IsNum(ch)){ //数字判断 }
Word[0]=ch; ch=fgetc(fp); i=1;
while(IsNum(ch)){
}
Word[i]='\0';
fseek(fp,-1,1); //回退 printf("%s\t无符号实数\n",Word);
Word[i]=ch; i++;
ch=fgetc(fp);
char Word[20]={'\0'}; char ch; int i,c;
ch=fgetc(fp); //获取字符,指针fp并自动指向下一个字符 if(IsAlpha(ch)){ //字母判断 }
Word[0]=ch; ch=fgetc(fp); i=1;
while(IsNum(ch)||IsAlpha(ch)){ //字母或数字判断 }
Word[i]='\0'; //'\0' 代表字符结束(空格) fseek(fp,-1,1); //回退一个字符 c=IsKey(Word); //关键字判断
if(c==0) printf("%s\t普通标识符\n",Word); //不是关键字 else if(c==2) printf("%s\t主函数\n",Word);
else printf("%s\t关键字\n",Word); //输出关键字
Word[i]=ch; i++;
ch=fgetc(fp);
else //开始判断的字符不是字母也不是数字 { Word[0]=ch; switch(ch){ case'[': case']': case'(': case')': case'{': case'}': case',': case'"':
case';':printf("%s\t界符\n",Word); break; case'+':ch=fgetc(fp); Word[1]=ch; if(ch=='='){
printf("%s\t运算符\n",Word);//运算符“+=” }
else if(ch=='+'){
printf("%s\t运算符\n",Word); //判断结果为“++” } else {
fseek(fp,-1,1);
printf("%s\t运算符\n",Word); //判断结果为“+” } break; case'-':ch=fgetc(fp);
Word[1]=ch; if(ch=='='){
printf("%s\t运算符\n",Word);
else if(ch=='-'){
printf("%s\t运算符\n",Word); //判断结果为“--” } else {
fseek(fp,-1,1);
printf("%s\t运算符\n",Word); //判断结果为“-” }
break;
case'*': case'/':
case'!':
}
case'=':ch=fgetc(fp);
if(ch=='='){
} else {
fseek(fp,-1,1);
printf("%s\t运算符\n",Word); } break;
printf("%s\t运算符\n",Word);
case'<':ch=fgetc(fp);
Word[1]=ch;
if(ch=='='){ }
else if(ch=='<'){
printf("%s\t运算符\n",Word); //判断结果为“<<” } else {
fseek(fp,-1,1);
printf("%s\t运算符\n",Word); //判断结果为“<” } break; Word[1]=ch;
if(ch=='=') printf("%s\t运算符\n",Word); else { } break; Word[1]=ch;
if(ch=='='){printf("%s\t运算符\n",Word);} if(IsAlpha(ch)) printf("%s\t类型标识符\n",Word); else { } break;
fseek(fp,-1,1);
printf("%s\t取余运算符\n",Word); fseek(fp,-1,1);
printf("%s\t运算符\n",Word); printf("%s\t运算符\n",Word);
//判断结果为运算符“<=”
case'>':ch=fgetc(fp);
case'%':ch=fgetc(fp);
default:printf("无法识别字符!\n"); break;
}
}
}
main() {
char in_fn[30]; //文件路径 FILE *fp;
printf("\n请输入源文件名(包括路径和后缀名):"); while(1){
gets(in_fn); //scanf("%s",in_fn);
if((fp=fopen(in_fn,"r"))!=NULL) break; //读取文件内容,并返回文件指针,该指针指向文件的第一个字符
else printf("文件路径错误!请重新输入:");
}
printf("\n******************* 词法分析结果如下 *******************\n"); do{
ch=fgetc(fp);
if(ch=='#') break; //文件以#结尾,作为扫描结束条件 else if(ch==' '||ch=='\t'||ch=='\n'){} //忽略空格,空白,和换行 else{ }
fseek(fp,-1,1); //回退一个字节开始识别单词流 scanner(fp);
}while(ch!='#'); system(“pause”); }
7. 验证文件:C:\abc.txt
void main() {
int i=6; j=i+i; printf("%d",j); return 0; } #
8. 运行结果截图:
四、实验体会
本次实验加深了我对编译器组成的认识,巩固了我对词法编译器原理的认知, 使我从细节上了解到词法分析器如何从构成源程序的字符串中识别出一个个具有独立意义的语法单位。在刚开始的编程过程中遇到了不少麻烦,在对问题的排查之中我加深了对词法分析过程中不可忽视的问题的理解,例如消除文本中的注释,空格,换行符以及其他一切对语法分析和代码生成均无关的信息对后续的词法分析是至关重要的。潜移默化中,我对C的逻辑编程能力提高了,同时也为后续的语法分析实验打下了基础。
正在阅读:
编译原理 词法分析器 流程代码解析08-29
失去你才知道的相关文章推荐02-14
国内运输合同(最新3篇)03-25
5工程项目进度规划和控制read08-24
考研央财801经济学考试范围03-22
2022人民警察节心得及感悟(最新4篇)03-22
坐井观天续写400字07-06
山东省燃气经营许可管理办法01-14
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 词法
- 分析器
- 编译
- 解析
- 原理
- 流程
- 代码
- 《小数加法和减法》说课稿
- 突破高中化学计算题
- 除尘脱硫操作规程
- 研究生自然辩证法开卷(广东工业大学)
- 中国南方电网电力调度通信中心职位申请表
- 申领生育保险待遇审核
- 合同供应商准入条件
- 常用电气英语单词
- 北师大版五年级语文上册期末试题有答案
- 汽车专业说课程
- 大学物理课后习题答案第八单元
- 修改2013年露天煤矿各工种岗位安全生产责任制1
- 电磁学试题大集合(含答案)
- 保险公司分支机构验收工作流程
- 高二英语校本课程---英文电影片段欣赏
- 在现实与想象之间自由飞翔(文学评论)——评二期《辽河》长篇科幻小说《终极》-论文
- 苏州市吴中、吴江、相城区2019-2020学年第一学期期末考试试题七年级语文(含答案)
- 2018-2019学年度苏教版六年级语文下册期末考试试题(含答案)
- 网络推广部工作内容及考核规定
- 全国公共管理机构清华大学节能培训网络作业参考答案