《北邮编译原理词法分析报告器实验.pdf》由会员分享,可在线阅读,更多相关《北邮编译原理词法分析报告器实验.pdf(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、实用文档词法分析程序设计一问题描述1. 可以识别出用C语言编写的源程序中的每个单词符号,并以记号的形式输出每个单词符号。2. 可以并识别读取源程序中的注释。3. 可以统计源程序中的语句行数、单词个数和字符数,其中标点和空格不计为单词,并输出统计结果。4. 检察源程序中存在的错误,并可以报告错误所在行列的位置。5. 发现原程序中存在的错误,进行适当修复,使词法分析可以继续进行,通过一次词法分析处理,可以检查并报告源程序中存在的所有错误。二算法思想编写一个词法分析程序,它从左到右逐个字符的对源程序进行扫描,产生一个个的单词形成记号流文件输出。其中,具体子问题有:(1)源程序文件读入缓冲区中(注意要
2、删除空格和无用符号)(2)确定读入的为关键字还是运算符还是变量名,对于普通标识符和常量,分别建立标识符表和常量表当遇到一个标识符或常量时,查找标识符表或常量表,若存在, 则返回位置,否则进入符号表或常量表中并返回表的入口地址。(3)对于各类运算符、标点符号、以及注释符号等,准确识别出来并打印输出结果(4)对于源文件中出现的数字常量,不但能按要求加入常量表中,还进行了字符型到float型数值的转换,便于后续程序操作处理。(4)尽量精简整合各种情况,使算法复杂度降低,精简易读。三、实验程序设计说明1. 主要函数说明void readChar();/读字符过程,每调用一次,从输入缓冲区读一个字符,并
3、把它放入变量C中,且向前扫描指针pointer指向下一个字符void ignoreSpace();/每次调用时,检查C中的字符是否为空字符,若是,则反复调用该过程,直到 C 进入一个非空字符为止void link();/把 C 中的字符与token 中的字符串连接起来bool alphabet();/布尔函数,判断C中的字符是否为字母,若是则返回true ,否则返回false bool digit();/布尔函数,判断C中的字符是否为数字,若是则返回true ,否则返回false int searchForKeywords();/查关键字表,若此函数的返回值为0,则表示token 中的字符串是
4、标识符,否则为关键字int searchForToken();/查符号表,若此函数的返回值为0,则表示token 中的字符串是新出现的,否则为已出现过的标识符int searchForNum(); / 查常数表,若此函数的返回值为0,则表示 token 中的数字是新出现的,否则为已出现的常数void insertTokenList();/将标识符插入符号表void insertNumList();/将数字插入常数表void fillBuffer(int a);/填充 buff的半区函数实用文档2程序源代码#include #include #include #include int point
5、er=0; / int i=0, j =0, c=0, appear , d=0, num_location; / int row_num=0, letter_num=0, word_num=0;int z=1;char C = ; / char token 30; / char buff 4095; / char token_list 200 30; / char number 200 10; / char next_charac, charac , file_name 20;char keywords 32 10= auto , break , case , char , const, c
6、ontinue, default, do , double , else, enum , extern, float, for, goto , if, int, long, register, return, short, signed, sizeo, fstatic, struct, switch, typedef, union, unsigned , void, volatile, while;double num ;FILE * file_pointer;void fillBuffer( int a) / / i=0;while(!feof ( file_pointer)& i =97
7、& C=65 & C =48 & C=57)returntrue;elsereturnfalse;int searchForKeywords() / for( int x=0; x32; x+)if(strcmp ( token , keywords x)= 0)return 0 ; / return 1 ;int searchForToken() / int i=0;while(i =c- 1)if(strcmp ( token , token_list i )= 0) appear=i ;return 0 ; / i+; word_num+;return 1 ;int searchForN
8、um() / int i=0;while(i =d- 1)if(strcmp ( token , number i )= 0) num_location=i ;实用文档return 0 ; / i+; word_num+;return 1 ;void insertTokenList() / strcpy(token_list c+, token );void insertNumList() / strcpy(number d+, token );main() printf( 输入源文件的路径:n); scanf( %s, file_name); file_pointer=fopen ( fil
9、e_name, r );if(file_pointer=NULL) printf( 无法查找到文件,发生错误!n ); / charac=fgetc ( file_pointer); fillBuffer( 0); / while(C != 0) readChar(); / ignoreSpace(); / switch(C ) / case 65 :case 66 :case 67 :case 68 :case 69 :case 70 :case 71 :case 72 :case 73: case 74 : case 75 : case 76 : case 77 : case 78 :ca
10、se 79 :case 80 : case 81: case82:case 83 :case 84 : case 85 : case 86 :case 87 :case 88 : case 89:case 90:case 97 :case 98: case 99: case 100: case 101: case 102: case 103: case 104: case 105: case 106:case 107 :case 108 :case 109 :case 110 :case 111 : case 112 : case 113 : case 114 : case115: case
11、116: case 117 : case 118 : case 119: case 120: case 121 : case 122 : case _: /? ? ? ? ? ? ?while(alphabet()|digit()|C =_ ) / link(); / readChar(); / / 实用文档 token j = 0; / j=0; / pointer-;/ if(searchForKeywords()= 1) / if(searchForToken ()= 1) / insertTokenList(); / printf(n, c- 1);else printf(n, app
12、ear ); / else printf(n, token ); / break;case 48 :case 49 :case 50 :case 51 :case 52 :case 53 :case 54 :case 55 :case 56 :case 57 : num=( C- 48); link(); readChar();while(digit() link(); num=num * 10+( C - 48); / readChar();if(C=.) link(); readChar();while(digit() link(); num=num +( C-48)* pow( 0.1
13、, z+); / readChar(); token j = 0; / j=0; / pointer-;if(searchForNum ()= 1) / insertNumList();/ printf(n, num , d- 1);else实用文档 printf(n, num , num_location); / break;case +: readChar();if(C= ) printf(n);elseif(C=+ ) printf(n );else pointer-; printf(n);break;case -: readChar();if(C=-) printf( );elseif
14、(C= ) printf(n );else pointer-; printf(n);break;case *: printf( n);break;case /: readChar();if(C=*) readChar(); next_charac=buff pointer;while(C != * & next_charac!= /) readChar(); next_charac=buff pointer; readChar(); printf(n);elseif(C=/)实用文档 readChar();while(C != n) readChar(); printf(n);else poi
15、nter-; printf(n);break;case % : printf( n);break;case (: printf( n);break;case ): printf(n);break;case : printf(n);break;case : printf(n);break;case : printf(n);break;case : printf(n);break;case : printf(n);break;case ;: printf(n);break;case ,: printf(n);break;case .: printf(n);break;case ?: printf(
16、n);break;case : printf(n);break;case #: printf(n);break;case : readChar();if(C= ) printf(=, 大于等于 n);实用文档else pointer-; printf(, 大于 n);break;case : readChar();if(C= ) printf( n);else pointer-; printf( n);break;case =: readChar();if(C= ) printf(n);else pointer-; printf(n);break;case &: readChar();if(C
17、=& ) printf(n);else pointer-; printf(n);break;case |: readChar();if(C=|) printf(n);else pointer-; printf(n);实用文档break;case !: readChar();if(C= ) printf(n);else pointer-; printf(n); break; printf( 该源文件的行数为:%d ,单词数为 %d ,字符数为%d.n , row_num, word_num, letter_num); system(pause );return 0 ;3程序的执行结果测试程序为:实用文档运行结果为:实用文档实用文档实用文档四、有待改进的地方