编译原理设计c语言的词法分析器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译原理课程设计报告
题目:
学院:
教师:
姓名:
学号:
班级:
评分:
签字:
编译原理课程设计一:设计c语言的词法分析器
一、实验目的
了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则,掌握状态图到识别程序的编程,加深对词法原理的理解。
二、实验要求
了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则,掌握状态图到识别程序的编程。
三、实验设计
3.1.单词分类及表示
3.1.1 C语言的子集分类
(1)标识符:以字母开头的字母数字串
(2)整数或浮点型。
(3)保留字:for,while,do,else,if,static,int,sizeof,break,continue
(4)运算符:+,-,*,/,%,>,<,=,!=,==,<=,>=,!,&,&&,||;
(5)界符:"(",")",",",":",";","{","}"
3.1.2单词二元组(单词分类号、单词自身值)
3.2 词法分析器的设计
3.2.1算法设计
3.2.1.1概要设计
从文件中逐个读取字符,只要这五大类的状态序列则继续读取,否则回退字符,在对应类别进行查找,输出单元二次组至另一文件夹。
3.2.1.2状态图设计
3.2.2输入输出设计
输入:通过文件指针从文件中一个一个读取字符
输出:输出单词二元组至文件。格式为(种别码,值)
3.2.3主要函数
void Getchar(FILE *fp ) //读入一个字符
void GetBC(FILE *fp)//读入一个非空字符
void contacat()//连接字符
int letter()//判断是否为字母
int digit()//判断是否为字母
void retract(FILE *fp,char *c)//回退
int reserve (char **k)//处理保留字
int sysmbol(identifier *id)//处理标识符,查找符号表并存放位置若没有则添加int constant(constnumber *con)//存入常数表,并返回它在常数表中的位置
void Tofile(int num, int val, identifier *id, constnumber *con, FILE *fw)//写到文件void WordAnalyze(char **k,char *c, char **CODE, identifier *id, constnumber *con, FILE *fp, FILE *fw)//词法分析函数
四、结果测试
文件输入
int main()
{
int a=1,b=3;
if(a>1)
b=b-2;
}
输出结果:
结论:程序输出结果与期望输出结果相符。
四、收获与感想
通过我本次课程设计掌握了词法分析器设计的基本方法与相关知识。词法分析的关键是明确各类字符的状态转换过程。同时辅助标识符、常量结构体与保留字表用于查找返回值。
同时我也对分析问题解决问题有了更深入全面的认识与理解。面对一个大的问题,需要理清解决的步骤再将其分解成小的模块逐个解决最后再串联在一起,问题就会变得更容易,思路也会更加清晰。
五、实验代码
#include
using namespace std;
#define LENGTH 10
char ch;
char *CODE[] = { "identifier","constant","keyword"/*保留字*/,"+","-","*","/","<","<=",">",">=","!=","==","=","(",")",",",":",";","{","}" };
char *k[] = { "for","while","do","else","if","static","int","sizeof","break","continue" };//保留字
char token[16];//存放处理后的字符串
//标识符结构体
typedef struct
{
char *I[256];
int len;
}identifier;
typedef struct
{
int cont[300];
int len;
}constnumber;
//读入一个字符
void Getchar(FILE *fp )
{
if ((ch = getc(fp)) == EOF)
exit(1);
}
//读入一个非空字符
void GetBC(FILE *fp)
{
while (ch == ' ' || ch == '\n' || ch == 9)
Getchar(fp);
}
//连接字符
void contacat()
{
char * cht = &(ch);
strcat_s(token, cht);
}
//判断是否为字母
int letter()
{
return isalpha(ch);
}
int digit()