- 1、本文档共14页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译原理词法分析器语法分析课程设计
《编译原理》
课 程 设 计
院 系 信息科学与技术学院
专 业 计算机科学与技术
年 级 2014级
学 号 2014111963
姓 名 张正超
词法分析器设计
一、设计题目
手工设计c语言的词法分析器(可以是c语言的子集)。
二、设计内容
处理c语言源程序,过滤掉无用符号,判断源程序中单词的合法性,并分解出正确的单词,以二元组形式存放在文件中。
三、设计目的
了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则,掌握状态图到识别程序的编程。
四、需求分析
4.1.源程序的预处理:源程序中,存在许多编辑用的符号,他们对程序逻辑功能无任何影响。例如:回车,换行,多余空白符,注释行等。在词法分析之前,首先要先剔除掉这些符号,使得词法分析更为简单。
4.2.单词符号的识别并判断单词的合法性:将每个单词符号进行不同类别的划分。单词符号可以划分成5中。
(1)标识符:用户自己定义的名字,常量名,变量名和过程名。
(2)常数:各种类型的常数。
(3) 保留字(关键字):如if、else、while、int、float等。
(4) 运算符:如+、-、*、、、=等。
(5)界符:如逗号、分号、括号等。
5.3.将所有合法的单词符号转化为便于计算机处理的二元组形式:(单词分类号,单词自身值)。
五、主要源代码
#include?stdio.h?
#include?string.h?
#include?ctype.h?
#include?stdlib.h?
#include?assert.h
#define?LENGTH1?10?//定义保留字的大小??
FILE?*?fp=NULL;?//输出流指针?
FILE?*?fw=NULL;?//输入流指针?
char /**/?character;?//字符?
char ?token[16];?//字符数组,用来存放已读入的字符序列??
//编码表?/**/
char*?CODE[]={identifier/*标识符*/,constant/*常数*/,keyword/*保留字*/,
+,-,??*,/,,=,,=,!=,==,=,(,),,,:,;,{,}};?//保留字表?char?
char*k[]={for,while,do,else,if,static,int,sizeof,break,continue};??
//标识符结构体?
typedef struct
{??
char?*?I[256];?//标识符数组?
?int?len;//标识符数量
}identifier;???
//常量结构体?
typedef/**/ struct
{??
int?cont[300];//存放常量的数组??
int?len;//常量的数目?
}constnumber;???
//读入一个字符,从输入流中读入一个字符到变量character中。?
void?getNextChar(FILE?*ifp)?
{??
if((character=getc(ifp))==EOF)???
exit(1);?
}
//读入非空白字符,检查变量character中的字符是否为空白字符或回车或换行符。若是,?
//则调用getNextChar()读入下一个字符,直到character中的字符满足条件.?
void?getnbc(FILE?*ifp)?
{???
while(character==?||?character==\n||character==9)??
{???
getNextChar(ifp);??
}??
}??
//连接字符串,把character中的字符连接到token数组的结尾。?
void?concat()?
{????????????????????????????????????????????????????????
?char?*?ct=character;??
strcat(token,ct);?
}??
//判断是否为字母。?
int?letter()?
{??
return?isalpha(character);
?}??
//判断是否为数字?
int?digit()?
{??
return?isdigit(character);
?}??
//回退字符,将刚读入的character中的字符回退到输入流中。并把character
文档评论(0)