词法
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
赵凯
湖北大学本科课程设计
题 目 基于C语言的词法分析器
姓 名 赵凯 学 号 2009221104210008 专业年级 09计科一班 指导教师 孙斌 职 称 讲师
20112年 11月 22日
目 录
引言..........................................................................3
第一章 概述................................................................4
1.1设计内容................. ............................................4
1.2设计要求..............................................................4
第二章 设计的基本原理 ......................................................4
2.1单词符号分类..........................................................4
2.2输出格式与存储格式................. ..................................4
第三章 程序设计......................... ..................................6
3.1结构思路............................. .................................6
3.2模块设计与分析....................... .................................6
第四章 测试程序........................... ................................7
4.1测试程序............................. .................................7
4.2分析结果............................. .................................7
4.3存储结构............................. .................................8
第五章 小结................................................................8 参考文献......................................................................8 附录 词法设计程序清单......................... ..........................9
基于C语言词法分析器的设计
摘要
文章首先对编译原理进行概括的介绍,第一章主要是描写设计内容及设计要求,第二章介绍设计的基本原理,第三章对程序设计的总体
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
及各模块设计做了介绍,第四章对程序进行测试,最后对文章基进行
总结
初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf
与展望。
关键词:编译原理 词法分析器 关键字 标识符 常数 运算符 界限符
引言:
《编译原理》是国内外各高等院校计算机科学技术类专业,特别是计算机软件专业的一门重要专业课程。该课程系统地向学生介绍编译程序的结构、工作流程及编译程序各组成部分的设计原理和实现技术。由于该课程理论性和实践性都比较强,内容较为抽象复杂,涉及到大量的软件设计算法,因此,一直是一门比较难学的课程。为了使学生更好地理解和掌握编译技术的基本概念、基本原理和实现方法,实践环节非常重要,只有通过上机进行程序设计,才能使学生对比较抽象的教学内容产生具体的感性认识,增强学生综合分析问题、解决问题的能力,并对提高学生软件设计水平大有益处。
编译原理涉及词法分析,语法分析,语义分析及优化设计等各方面。词法分析(英语:lexical analysis)是计算机科学中将字符序列转换为单词(Token)序列的过程。进行语法分析的程序或者函数被称为词法分析器(Lexical analyzer简称Lexer),也叫扫描器(Scanner)。词法分析器一般以函数的形式存在,供语法分析器调用。
词法分析阶段是编译过程的第一个阶段,是编译的基础。这个阶段的任务是从左到右一个字符接着一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号)。词法分析程序实现这个任务。词法分析程序可以使用Lex等工具自动生成。词法分析是所有分析优化的基础,涉及的知识较少,比如状态转换图等,易于实现。本次课程设计程序设计语言是C语言。
第一章:概述
1.1设计内容
设计一个程序,调试、编译,实现词法分析的功能,识别各单词或字符所属类别,并显示在屏幕上。
1.2设计要求
词法分析器:逐个读入源程序字符并按照构词规则切分成一系列单词。单词是语言中具有独立意义的最小单位,包括保留字、标识符、运算符、标点符号和常量等。词法分析是编译过程中的一个阶段,在语法分析前进行 。也可以和语法分析结合在一起作为一遍,由语法分析程序调用词法分析程序来获得当前单词供语法分析使用。
要求:利用该词法分析器完成对源程序字符串的词法分析。输出形式是源程序的单词符号二元式的代码,并保存到自己命名的文件中。
单词符号及种别编码
单词符号 种别编码 单词符号 种别编码 main 1 变量符号 20 if 2 = 45 int 3 > 46 for 4 < 47 while 5 >= 48 do 6 <= 49 return 7 == 50 … … ! 51 # 40 % 52 + 41 & 53 - 42 …… ……
第二章 设计原理
2.1单词符号分类
单词是程序设计语言的基本语法单位和最小语义单位。单词符号一般分为五大类
(1) 关键字"begin","end","if","then","else","while","write","read",
"do", "call","const","char","until","procedure","repeat"等
(2) 运算符:"+","-","*","/","="等
(3) 界符:"{","}","[","]",";",",",".","(",")",":"等
(4) 标识符
(5) 常量
2.2输出格式与存储格式
输出格式:
(种别编码,单词符号)
结构如下图1
图1
存储格式:
(种别编码,单词符号)
结构如下图2
图2
备注:关键词每个都有一个编码,标识符统一用以各种别编码识别,常数、运算符以及界限
符各有一个种别编码识别。
第三章:程序设计
3.1结构思路
定义相关的变量和数据结构。关键字作为特殊标识符处理,把它们预先安排在一张
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。特殊定义其他运算符以及界限符。把每个种类都归为一起。
3.2模块设计与分析
void options(); //菜单 void analyse(); //分析结果显示
void getch(char ch); //读取为字母
void getnum(char ch); //读取为数字
void getspace(char ch); //读取空格、跳格、回车、换行等等(包括界限符) void getelse(char ch); //其他类型字符
struct keywords //关键字结构体
{
char name[10];
int num;
};
struct relation //运算符、关系运算符结构体
{
char name[4];
int num;
};
struct keywords test[18]={
{"main",1},{"if",2},{"int",3},{"for",4},{"while",5},{"do",6},
{"retuen",7},{"break",8},{"continue",9},{"stdio.h",10},
{"include",11},{"case",12},{"float",13},{"switch",14},
{"void",15},{"else",16},{"for",17}
};
struct relation relation[18]={
{"#",40},{"+",41},{"-",42},{"*",43},{"/",44},{"=",45},{">",46},
{"<",47},{">=",48},{"<=",49},{"==",50},{"!",51},{"%",52},{"&",53},
{"&&",54},{"|",55},{"||",56},{"!=",58}
};
struct value //处理变量的结构体
{
int type;
int no;
char str[20];
}value[10];
int variable(char str[10]); //变量处理
char ch='1';
char str[10];
int k=0,i=0;
char sourcefile[30]; //源文件名 char objectfile[30]; //目标文件名 FILE *fp,*hp;
int count=-1;
int flag=-1;
第四章:测试程序 4.1测试程序
#include
#include #include using namespace std;
string key[17]={"begin","end","if","then","else","while","write","read","do",
"call","const","char","until","procedure","repeat","void"};
main()
{
int a=21;
char h="heart";
}
4.2分析结果
分析结果如图3
图3
4.3存储结构
存储结构如图4
图4
第五章:小结
词法分析的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号,通过本实验的完成,更加加深了对词法分析的理解。
参考文献:
黄文奇 许如初. 《近世计算理论导引:NP难度问题的背景、前景及其求解算法研究》. 科学出版社 2004
吕国英. 《算法设计与分析》 清华大学出版社 2009
杨路明. 《C语言程序设计教程》. 北京邮电大学出版社. 2003 李春葆 尹为民等. 《数据结构教程(第3版)》. 清华大学出版社 2009 《编译原理》(第二版),作者:何炎祥,李晓燕,王汉飞
《编译原理课程辅导》,作者:王生原,吕映芝,张素琴
附录:
词法设计程序清单如下:
#include
#include
#include
struct keywords //关键字结构体
{
char name[10];
int num;
};
struct relation //运算符、关系运算符结构体
{
char name[4];
int num;
};
struct keywords test[18]={
{"main",1},{"if",2},{"int",3},{"for",4},{"while",5},{"do",6},
{"retuen",7},{"break",8},{"continue",9},{"stdio.h",10},
{"include",11},{"case",12},{"float",13},{"switch",14},
{"void",15},{"else",16},{"for",17}
};
struct relation relation[18]={
{"#",40},{"+",41},{"-",42},{"*",43},{"/",44},{"=",45},{">",46},
{"<",47},{">=",48},{"<=",49},{"==",50},{"!",51},{"%",52},{"&",53},
{"&&",54},{"|",55},{"||",56},{"!=",58}
};
struct value //处理变量的结构体
{
int type;
int no;
char str[20];
}value[10];
void options(); //菜单 void analyse(); //分析结果显示
void getch(char ch); //读取为字母
void getnum(char ch); //读取为数字
void getspace(char ch); //读取空格、跳格、回车、换行等等(包括界限符) void getelse(char ch); //其他类型字符
int variable(char str[10]); //变量处理
char ch='1';
char str[10];
int k=0,i=0;
char sourcefile[30]; //源文件名 char objectfile[30]; //目标文件名 FILE *fp,*hp;
int count=-1;
int flag=-1; //标志
int main(int argc,char *argv[])
{
int choice;
options(); //显示菜单
printf("输入进行词法分析的源文件名:");
scanf("%s",sourcefile);
printf("\n输入分析结果存入的文件名:");
scanf("%s",objectfile);
printf("\n");
printf("请输入选择项(1或者2):");
//printf("\n输入选项:");
scanf("%d",&choice);
for(; ;)
{
switch(choice)
{
case 1:
analyse();
break;
case 2:
exit(1);
break;
}
break;
}
return 0;
}
void options()
{
printf("***************************\n");
printf("***");
printf(" 《词法分析器》");
printf(" ***\n");
printf("***");
printf(" 1.分析结果:");
printf(" ***\n");
printf("***");
printf(" 2.退出程序:");
printf(" ***\n");
printf("***************************\n");
}
void analyse()
{
if((fp=fopen(sourcefile,"r"))==NULL) //读取文件
{
printf("读文件打开错误~\n");
exit(1);
}
if((hp=fopen(objectfile,"w"))==NULL) //写入文件
{
printf("写入文件打开错误~\n");
exit(1);
}
while(ch!=EOF) //判断是否到文件结尾
{
ch=fgetc(fp); //读取磁盘字符串
if(((ch>='a')&&(ch<='z'))||((ch>='A')&&(ch<='Z')))
{
getch(ch);
}
else
if((ch>='0')&&(ch<='9')) //如果读取的是数字
{
getnum(ch);
}
else
if((ch==' ')||(ch=='\r')||(ch=='\n')||(ch=='\t'))
{
getspace(ch);
}
else //其他情况
{
getelse(ch);
}
k=0; //单个字符标志
str[k]='\0';
};
fclose(fp); //关闭读文件
fclose(hp); //关闭写文件
printf("\n");
}
void getch(char ch) {
for(; ;)
{
str[k]=ch;
str[++k]='\0';
ch=fgetc(fp);
if( !(( (ch>='a') && (ch<='z') ) || ( (ch>='A') && (ch<='Z') ) || ( (ch>='0') &&
(ch<='9') )||ch=='.')) {
fseek(fp,-1L,1);
for(i=0;i<11;i++)
{
if(strcmp(str,test[i].name)==0) //测试是否为保留字
{
printf("( %d,%s )\n",test[i].num,test[i].name);
fprintf(hp,"( %d,%s )\n",test[i].num,test[i].name);
k=0;
flag=1;
value[count+1].type=test[i].num;
break;
}
}
if(k!=0) //否则为变量
{
int tem;
tem=variable(str);
printf("( 20,%s ) \n",str);
fprintf(hp,"( 20,%d )\n",tem);
break;
}
break;
}
}
}
void getnum(char ch) {
for(; ;)
{
str[k]=ch;
str[++k]='\0';
ch=fgetc(fp);
if( !((ch>='0') && (ch<='9')) )
{
fseek(fp,-1L,1);
printf("( 30,%s ) \n",str);
fprintf(hp,"( 30,%s )\n",str);
break;
}
}
}
void getspace(char ch) //判断时候是空格、跳格、回车、换行等等 {
for(; ;)
{
ch=fgetc(fp); //检测读取字符
if(!((ch==' ')||(ch=='\n')||(ch=='\t')||(ch=='\r')))
{
fseek(fp,-1L,1);
break;
}
}
}
void getelse(char ch) //其他字符,包括界限符 {
switch(ch)
{
case '.':
printf("( 60, . )\n");
fprintf(hp,"( 60,. )\n");
break;
case '#':
printf("( 40, # )\n");
fprintf(hp,"( 40,# )\n");
break;
case ',':
if(flag==1)
value[count+1].type=value[count].type;
printf("( 61, , )\n");
fprintf(hp,"( 61,, )\n");
break;
case ';':
flag=0;
value[count+1].type=2;
printf("( 62, ; )\n");
fprintf(hp,"( 62,; )\n");
break;
case '{':
printf("( 63, { )\n");
fprintf(hp,"( 63,{ )\n");
break;
case '}':
printf("( 64, } )\n");
fprintf(hp,"( 64,} )\n");
break;
case '(':
printf("( 65, ( )\n");
fprintf(hp,"( 65,( )\n");
break;
case ')':
printf("( 66, ) )\n");
fprintf(hp,"( 66,) )\n");
break;
case '+':
printf("( 41, + )\n");
fprintf(hp,"( 41,+ )\n");
break;
case '-':
printf("( 42, - )\n");
fprintf(hp,"( 42,- )\n");
break;
case '*':
printf("( 43, * )\n");
fprintf(hp,"( 43,* )\n");
break;
case '/':
printf("( 44, / )\n");
fprintf(hp,"( 44,/ )\n");
break;
case '=':
str[k]=ch;
str[++k]='\0';
ch=fgetc(fp);
if(ch!='=')
{
fseek(fp,-1L,1);
printf("( 45, = )\n");
fprintf(hp,"( 45,= )\n");
}
else
if(ch=='=')
{
printf("( 50, = )\n");
fprintf(hp,"( 50,= )\n");
}
break;
case '>':
str[k]=ch;
str[++k]='\0';
ch=fgetc(fp);
if(ch!='=')
{
fseek(fp,-1L,1);
printf("( 46, > )\n");
fprintf(hp,"( 46,> )\n");
}
else if(ch=='=')
{
printf("( 48, > )\n");
fprintf(hp,"( 48,> )\n");
}
break;
case '<':
str[k]=ch;
str[++k]='\0';
ch=fgetc(fp);
if(ch!='=')
{
fseek(fp,-1L,1);
printf("( 47, < )\n");
fprintf(hp,"( 47,0 )\n");
}
else
if(ch=='=')
{
printf("( 49,0 )\n");
fprintf(hp,"( 49,0 )\n");
}
break;
case '!':
str[k]=ch;
str[++k]='\0';
ch=fgetc(fp);
if(ch!='=')
{
fseek(fp,-1L,1);
printf("( 51, != )\n");
fprintf(hp,"( 51,!= )\n");
}
else
if(ch=='=')
{
printf("( 58, != )\n");
fprintf(hp,"( 58,0 )\n");
}
break;
case '%':
printf("( 52, % )\n");
fprintf(hp,"( 52,% )\n");
break;
case '&':
str[k]=ch;
str[++k]='\0';
ch=fgetc(fp);
if(ch!='&')
{
fseek(fp,-1L,1);
printf("( 53, & )\n");
fprintf(hp,"( 53,& )\n");
}
else
if(ch=='&')
{
printf("( 54, && )\n");
fprintf(hp,"( 54,&& )\n");
}
break;
case '|':
str[k]=ch;
str[++k]='\0';
ch=fgetc(fp);
if(ch!='|')
{
fseek(fp,-1L,1);
printf("( 55, | )\n");
fprintf(hp,"( 55,0 )\n");
}
else if(ch=='||')
{
printf("( 56, || )\n");
fprintf(hp,"( 56,|| )\n");
}
break;
}
}
int variable(char str[10]) {
int j;
for(j=0;j
本文档为【词法分析赵凯】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。