1、编译原理词法分析实验报告编译原理词法分析实验报告一 实验题目:设计基于 C 语言词法分析器 二 实验目的:通过设计编制调试 C 语言的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。三 词法分析器的算法分析:(可用 N-S 图或流程图)四 程序代码 程序开始运行 读取文件中的程序且分析读到的字符 是字母 识别保留字和标识符 是 是数字 识别整数 是 否 否 是否是下划线
2、 否 是 识别其他的符号 识别注释的内容 输出程序的数字和标识符 程序结束!#includeusing namespace std; string keywords20 = “include”,“void”,“main”,“int”,“char”,“float”,“double”,“if”,“else”,“then”,“break”,“continue”,“for”,“do”,“while”,“printf”,“scanf”,“begin”,“end”,“return” ; char rz99999 = “ ”; string id10000; int pp = 0; string nu100
3、00; int qq = 0;int isLetter(char a)/判断是否是字母 if(a=a;a=A;a=0;(a-0)=9) return 1;/_添加了判断是否为数字的函数_/else return 0; int alpha(int st)/识别保留字和标识符,给此函数的的语句加上注释。char wordbuf20 = “ ”;/定义一个字符数组,用来存放需要得判断字符。int n = 0;/指针只向第一位。for (;)wordbufn = rzst;/吧要判断的字符赋值给字符数组。st+;/指针往下一位指。n+;/指针往下一位指。if (isDigit(rzst) = 1) |
4、 (isLetter(rzst) = 1) | (rzst = _)/判断是否符合首字母为字母,数字或下划线。wordbufn = rzst;/符合就赋值,继续匹配。elsebreak;/不符合就跳出函数。int flag = 0;for (int k = 0; k 20; k+)/判断上步所匹配的字符串是否为关键字。是的话则将 flag 置 1,否则继续匹配if (strcmp(keywordsk.c_str,wordbuf) = 0) /判断字符串是否相等。flag = 1;/相等将 flag 赋值为 1。if (flag = 0)int flagg = -1;for (int t = 0
5、; t pp; t+)/判断是否重复出现过,并且标记 flag。if (strcmp(idt.c_str, wordbuf) = 0)/判断字符串是否相等。flagg = t; if (flagg != -1)/如果不存在直接输出。printf(“ (id,%d) ”, flagg);elseidpp = wordbuf;/若存在输出原编号printf(“ (id,%d) ”, pp);pp+;/下表加一。Else/输出匹配到的关键字。printf(“ (”);for (int i = 0; i n; i+)printf(“%c”, wordbufi);printf(“,-) ”);retur
6、n st;/返回下标 int number(int st)/识别整数 char numbuf20 = “ ”;/定义一个数组存数字int n = 0;int k = 0;int flag = 0;for (;)numbufn = rzst;st+;n+;if (isDigit(rzst) = 1)/如果是数字存入数组numbufn = rzst;else if (k = 0) ; (rzst = .)/否则numbufn = rzst;k+;else if (isLetter(rzst) = 1) numbufn = rzst;flag = 1;continue;elsebreak;if (f
7、lag = 0)int flagg = -1;for (int t = 0; t qq; t+)if (strcmp(nut.c_str, numbuf) = 0)flagg = t;if (flagg != -1)printf(“ (nu,%d) ”, flagg);elsenuqq = numbuf;printf(“ (nu,%d) ”, qq);qq+; else printf(“ (”);for (int i = 0; i n; i+)printf(“%c”, numbufi);printf(“,error digital!) ”);return st; int anotation(i
8、nt st)/处理除号/和注释,给此函数的语句加上注释char tabuf9999 = “ ”;/定义字符数组,用来存放需要判断的字符。int n = 0;/指针指向第一位st+;/指针指向第一位if (rzst = /)/形成单行注释printf(“(/,-)”);/将其输出st+;/指针指向下一位while (rzst != 10)/当遇到换行符时跳出,否则持续赋值注释内容 tabufn = rzst; /赋值st+;/指针指向下一位n+;/指针指向下一位printf(“ n 注释”);for (int i = 0; i n; i+)/输出注释的信息printf(“%c”, tabufi)
9、;else if (rzst = _)/形成多行注释printf(“(/_,-)”);st+;/指针指向下一位int stt = st + 1;while (1)if (rzst = _ ; rzst + 1 = /)/遇到_/跳出循环break;tabufn = rzst;/赋值st+;/指针指向下一位n+;/指针指向下一位 if (rzst + 1 = 0)/空格就报错!printf(“(/_error!n)”);return st + 1;/返回printf(“ n 注释”);for (int i = 0; i :st+;if (rzst = =)st+;printf(“ (rlop,=
10、)”);else printf(“ (rlop,)”);break;case:st+;if (rzst = =)st+; printf(“ (rlop,=)”);elseprintf(“ (rlop,)”);break;case%:st+;if (rzst = =)st+;printf(“(%=,-) ”);elseprintf(“(%,-)”);break;case!:st+;if (rzst = =)st+;printf(“(!=,-)”); elseprintf(“(!,wrong thing!)”);break;case;:st+;if (rzst = ;)st+;printf(“ (
11、;,-)”);else printf(“ (;,worng word!)”);break;case|:st+;if (rzst = |)st+;printf(“(|,-)”);elseprintf(“( |,worng word ! )”);break; case:st+;printf(“(,-)”);break;case:st+;printf(“(,-)”);break;case(:st+;printf(“(,-)”);break;case):st+;printf(“,-)”);break;case:st+;printf(“(,-)”);break;case:st+; printf(“(,-
12、)”);break;case:st+;printf(“(:,-)”);break;case#:st+;printf(“(#,-)”);break;case;:st+;printf(“(;,-)”);break;case.:st+;printf(“(.,-)”);break;case,:st+;printf(“(,-)”);break;case : st+;break;case :st+;break;case 10:st+;printf(“n”);break;case34:st+;printf(“ (”,-)“);break;case39:st+;printf(”(,-)“);break;def
13、ault:printf(”(%c,worngthing) “, rzst);st+;return st; int choice(int st)/根据读入的单词的第一个字符确定调用不同的单词识别函数 if (isLetter(rzst) = 1)st = alpha(st);else if (isDigit(rzst) = 1)st=number(st); /_调用函数_/else if (rzst = /)st=anotation(st);/_调用函数_/elsest=other(st);/_调用函数_/return st; int main int i = 0;FILE_fp;char na
14、me10;printf(”请输入文件名:n“);scanf(”%s“, ;name);if (fp = fopen(name, ”r“) = NULL) printf(”Open error!“);e_it(0);char ch = fgetc(fp);while (ch != EOF)rzi = ch;i+;ch = fgetc(fp);fclose(fp);int j = 0;while (rzj != 0)j = choice(j);cout endl ”程序中标示符如下 “ endl;for (i = 0; i pp; i+)cout i ”“ idi endl;cout ” 程序中数字如下“ endl;for (j = 0; j qq; j+)cout j ”“ nuj endl;system(”pause;); 五 运行结果及分析六 实验心得
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1