当前位置:文档之家› 编译原理设计c语言的词法分析器

编译原理设计c语言的词法分析器

编译原理课程设计报告题目:学院:教师:姓名:学号:班级:评分:签字:编译原理课程设计一:设计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<iostream>using namespace std;#define LENGTH 10char 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(){return isdigit(ch);}//回退void retract(FILE *fp,char *c){int a=ftell(fp);fseek(fp,0,SEEK_SET);fprintf_s(fp, "%c", ch);ch = ' ';fseek(fp, a, SEEK_SET);}//处理保留字int reserve (char **k){int i;for (i = 0;i < LENGTH;i++){if (strcmp(token, k[i]) == 0)return (i + 1);}return 0;}//处理标识符,查找符号表并存放位置若没有则添加int sysmbol(identifier *id){int i;for (i = 0;i < id->len;i++)if (strcmp(token, id->I[i]) == 0)return i + 1;if (id->len > 256){cout << "error";}id->I[id->len] = token;id->len++;return id->len;}//数字字符串转化为整数int str_to_num(){int i=0;int k = token[i]-'0';for (i = 1;token[i] != '\0';i++){k = k * 10 + token[i] - '0';}return k;}//存入常数表,并返回它在常数表中的位置int constant(constnumber *con){con->cont[con->len] = str_to_num();con->len++;return con->len;}//写到文件void Tofile(int num, int val, identifier *id, constnumber *con, FILE *fw){int num_ = num;fprintf_s(fw, "(%d,",num);if (num >= 4)fprintf_s(fw,"%s", CODE[num-1]);if (num < 4){switch (num){case 1:fprintf_s(fw, "%s", id->I[val - 1]);break;case 2:fprintf_s(fw, "%d", con->cont[val - 1]);break;case 3:fprintf_s(fw, "%s", k[val - 1]);break;}}fprintf_s(fw, ")\n");}void error(FILE *fw){cout << "(Error," << ch << ")" << endl;fprintf_s(fw, "(Error,%c\n)", ch );}//词法分析函数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()){contacat();Getchar(fp);}retract(fp, c);num = reserve(k);if (num != 0)Tofile(3, num, id, con,fw);else{val = sysmbol(id);Tofile(1, val, id, con,fw);}}else if (digit())//处理常数{while (digit()){contacat();Getchar(fp);}retract(fp,c);val = constant(con);Tofile(2, val, id, con,fw);}else //分析符号{switch (ch){case'<':Getchar(fp);if (ch == '=')Tofile(9, 0, id, con,fw);else{retract(fp,c);Tofile(8, 0, id, con,fw);}break;case'>':Getchar(fp);if (ch == '=')Tofile(11, 0, id, con,fw);else{retract(fp,c);Tofile(10, 0, id, con,fw);}break;case'=':Getchar(fp);if (ch == '=')Tofile(13, 0, id, con,fw);else{retract(fp,c);Tofile(14, 0, id, con,fw);}break;case'!':Getchar(fp);if (ch == '=')Tofile(12, 0, id, con,fw);elseerror(fw);break;case'+':Tofile(4, 0, id, con,fw);break;case'-':Tofile(5, 0, id, con,fw);break;case'*':Tofile(6, 0, id, con,fw);break;case'/':Tofile(7, 0, id, con, fw);break;case'(':Tofile(15, 0, id, con, fw);break;case')':Tofile(16, 0, id, con, fw);break;case',':Tofile(17, 0, id, con, fw);break;case':':Tofile(18, 0, id, con, fw);break;case';':Tofile(19, 0, id, con, fw);break;case'{':Tofile(20, 0, id, con, fw);break;case'}':Tofile(21, 0, id, con, fw);break;default:error(fw);}}}int main(){char c[100] = "F://1.txt";FILE *fp,*fw;errno_t err;err = fopen_s(&fp, c, "r");if (err != 0){printf("Thefile was not opened\n");exit(0);}errno_t err1;err1 = fopen_s(&fw, "F://2.txt", "w");if (err1 != 0){printf("Thefile was not opened\n");exit(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){WordAnalyze(k, c, CODE, id, con, fp, fw);if (feof(fp))break;}fclose(fw);fclose(fp);return 0;}。

相关主题