编译原理课程设计报告
题目: 学院: 教师: 姓名: 学号: 班级:
评分: 签字:
编译原理课程设计一:设计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单词二元组(单词分类号、单词自身值)
单词 标识符 整数或浮点型 保留字 运算符 界符 分类号 1 2 3 4 5 3.2 词法分析器的设计
3.2.1算法设计
3.2.1.1概要设计
从文件中逐个读取字符,只要这五大类的状态序列则继续读取,否则回退字符,在对应
类别进行查找,输出单元二次组至另一文件夹。
开始打开txt文件读取c语言代码扫描Y是否读取到相应字符YY常数?标识符保留字运算符界符?记录标号结束
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
*CODE[]
=
{
\
保
留
字
*/,\
char *k[] = { \保留字 char token[16];//存放处理后的字符串
//标识符结构体 typedef struct {
typedef struct
char *I[256]; int len;
}identifier;
{
int cont[300]; int len;
}constnumber; //读入一个字符 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 a=ftell(fp); fseek(fp,0,SEEK_SET); fprintf_s(fp, \ch = ' ';
fseek(fp, a, SEEK_SET); return isdigit(ch); return
isalpha(ch);
char * cht = &(ch); strcat_s(token, cht);
while (ch == ' ' || ch == '\\n' || ch == 9)
Getchar(fp);
if ((ch = getc(fp)) == EOF)
exit(1);
{ }
//处理标识符,查找符号表并存放位置若没有则添加 int sysmbol(identifier *id) { }
//数字字符串转化为整数 int str_to_num() { }
//存入常数表,并返回它在常数表中的位置 int constant(constnumber *con) { }
//写到文件
void Tofile(int num, int val, identifier *id, constnumber *con, FILE *fw)
con->cont[con->len] = str_to_num(); con->len++;return con->len; int i=0;
int k = token[i]-'0';
for (i = 1;token[i] != '\\0';i++) { } return k;
k = k * 10 + token[i] - '0'; int i;
for (i = 0;i < id->len;i++) { }
id->I[id->len] = token; id->len++; return id->len;
cout << \
if (strcmp(token, id->I[i]) == 0) return i + 1; int i;
for (i = 0;i < LENGTH;i++) { } return 0;
if (strcmp(token, k[i]) == 0)
return (i + 1);
if (id->len > 256)
{ }
void error(FILE *fw) { }
//词法分析函数
void WordAnalyze(char **k,char *c, char **CODE, identifier *id, constnumber *con, FILE *fp, FILE *fw) {
int num, val;
strcpy_s(token, \初始化为空字符串 Getchar(fp); GetBC(fp);
if ((ch >= 'A'&&ch <= 'Z') || (ch >= 'a'&&ch <= 'z')) //分析标识符和保留字 {
//若字符为A~Z或0~9,则继续读取 while (letter() || digit()) { }
retract(fp, c); num = reserve(k); if (num != 0) else {
val = sysmbol(id); Tofile(3, num, id, con,fw); contacat(); Getchar(fp);
cout << \fprintf_s(fw, \int num_ = num; fprintf_s(fw, \if (num >= 4) { }
fprintf_s(fw, \
switch (num) {
case 1:fprintf_s(fw, \case 2:fprintf_s(fw, \case 3:fprintf_s(fw, \}
fprintf_s(fw,\if (num < 4)
}
}
Tofile(1, val, id, con,fw);
else if (digit())//处理常数 { }
else //分析符号 {
switch (ch) { case'<':
Getchar(fp); if (ch == '=') else { } break; Getchar(fp); if (ch == '=') else { } break; Getchar(fp); if (ch == '=') else {
Tofile(13, 0, id, con,fw); retract(fp,c);
Tofile(10, 0, id, con,fw); Tofile(11, 0, id, con,fw); retract(fp,c);
Tofile(8, 0, id, con,fw); Tofile(9, 0, id, con,fw);
while (digit()) { }
retract(fp,c); val = constant(con); Tofile(2, val, id, con,fw);
contacat(); Getchar(fp);
case'>':
case'=':
}
retract(fp,c);
Tofile(14, 0, id, con,fw);
break; Getchar(fp); if (ch == '=') else
error(fw); break;
Tofile(4, 0, id, con,fw); break;
Tofile(5, 0, id, con,fw); break;
Tofile(6, 0, id, con,fw); break;
Tofile(7, 0, id, con, fw); break;
Tofile(15, 0, id, con, fw); break;
Tofile(16, 0, id, con, fw); break;
Tofile(17, 0, id, con, fw); break;
Tofile(18, 0, id, con, fw); break;
Tofile(19, 0, id, con, fw); break;
Tofile(20, 0, id, con, fw); break;
Tofile(21, 0, id, con, fw); break;
Tofile(12, 0, id, con,fw);
case'!':
case'+':
case'-':
case'*':
case'/':
case'(':
case')':
case',':
case':':
case';':
case'{':
case'}':
}
}
default: }
error(fw);
int main() { }
char c[100] = \FILE *fp,*fw; errno_t err;
err = fopen_s(&fp, c, \if (err != 0) { }
errno_t err1;
err1 = fopen_s(&fw, \if (err1 != 0) { }
identifier *id=(identifier *)malloc(sizeof(identifier));id->len = 0;
constnumber *con=(constnumber *)malloc(sizeof(constnumber));con->len = 0; WordAnalyze(k, c, CODE, id, con, fp, fw); while (1) { } fclose(fw); fclose(fp); return 0;
WordAnalyze(k, c, CODE, id, con, fp, fw); if (feof(fp))break;
printf(\exit(0);
printf(\exit(0);
}
}
default: }
error(fw);
int main() { }
char c[100] = \FILE *fp,*fw; errno_t err;
err = fopen_s(&fp, c, \if (err != 0) { }
errno_t err1;
err1 = fopen_s(&fw, \if (err1 != 0) { }
identifier *id=(identifier *)malloc(sizeof(identifier));id->len = 0;
constnumber *con=(constnumber *)malloc(sizeof(constnumber));con->len = 0; WordAnalyze(k, c, CODE, id, con, fp, fw); while (1) { } fclose(fw); fclose(fp); return 0;
WordAnalyze(k, c, CODE, id, con, fp, fw); if (feof(fp))break;
printf(\exit(0);
printf(\exit(0);
百度搜索“70edu”或“70教育网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,70教育网,提供经典综合文库编译原理 设计c语言的词法分析器在线全文阅读。
相关推荐: