北邮编译原理词法分析报告器实验.docx

上传人:陆** 文档编号:4645786 上传时间:2021-10-16 格式:DOCX 页数:17 大小:87.42KB
返回 下载 相关 举报
北邮编译原理词法分析报告器实验.docx_第1页
第1页 / 共17页
北邮编译原理词法分析报告器实验.docx_第2页
第2页 / 共17页
点击查看更多>>
资源描述

《北邮编译原理词法分析报告器实验.docx》由会员分享,可在线阅读,更多相关《北邮编译原理词法分析报告器实验.docx(17页珍藏版)》请在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中,且向前扫描指针poin ter指向下一个字符void ignoreSpace();每次调用时,检查C中的字符是否为空字符,若是,则反复调用该过程,直到C进入一个非空字符为止void link(); 把C中的字符与token中的字符串连接起来bool alphabet。;/布尔函数,判断 C中的字符是否为字母,若是则返回true,否则返回falsebool digit();/布尔函数,判断C中的字符是否为数字,若是则返回true,否则返回falseint searchForKeywords();查关键字表,若此函数的返回值为0,则表示token中的字符串是标识符,

4、否则为关键字0,则表示token中的字符串是新岀0,则表示token中的数字是新岀现的,int searchForToke n();查符号表,若此函数的返回值为现的,否则为已岀现过的标识符int searchForNum(); /查常数表,若此函数的返回值为否则为已岀现的常数 void in sertToke nList();void in sertNumList(); void fillBuffer(int a);/将标识符插入符号表将数字插入常数表填充buff的半区函数2. 程序源代码#i nclude#in clude#in clude#in cludeint pointer=0; /i

5、nt 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;charkeywords 32 10= auto , break , case , char , const , continue , de

6、fault , do, double , else , enum, extern , float , for , goto , if , int , long , register, return , short , signed , sizeo , fstatic , struct , switch , typedef , union , un signed , void , volatile , while ;double num ;FILE * file_pointer ;void fillBuffer(int a )/文档/i =0;while(! feof (file_pointer

7、 ) & i =97 &C=65 &C =48 & C=57)return true;elsereturn false;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

8、 searchForNum () /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( f

9、ile_name , r);if( file_pointer =NULL) printf(无法查找到文件,发生错误!n ); /charac =fgetc (file_po in ter );fillBuffer (0); /while( C!= 0 )readChar (); /ignoreSpace(); /switch( C)/case65 :case66 :case67 :case68 :case69 :case70 :case71 :case72 :case73:case 74 :case 75 :case76 :case77 :case78 :case79 :case80 :cas

10、e81 :case82:case83 : case84 :case85 :case86 :case87 :case88 :case89:case90:case97 :case 98: case 99: case 100: case 101: case 102: case 103: case 104: case 105: case 106:case107 :case108 : case 109 :case110 :case! 111:case 112:case 113:case 114:case115:case116:case 117: case118 :case119:case120: cas

11、e121 : case122 : case _:/? ? ? ? ?while( alphabet(川digit(川C=_) /link();/readChar(); /tokenjpoi nterj = 0 ; /=0; /-;/if( searchForKeywords ()= 1) / if( searchForToken ()= 1)/in sertToke nListprintf();/(n,c-1); elseprintf(v ID, %d n,appear);/elseprintf(n,token ); /break;case48 : case49 : case50 : case

12、 51 : case 52 :case53 : case54 : case55 : case 56 : case 57 :num=(C-48);link();readCharwhile();digit ()linknum();=nun* 10+( C- 48); /readChar(); if( linkC=. )readChar();();linkwhile( digit ()();num=num+( C-48)* pow( 0.1 , z+); /readChar();tokenjpoi nterj=0 ; /=0; /in sertNumListprintfif( searchForNu

13、m ()= 1) /();/(n, num d- 1); elseprintf(n, num num_location );/break;case +readChar();if( C= )printf(+=,else if(C=+ )printf(+,elsepoin ter-;printf(n);加号n);readChar();if( C=- )printf( -,else if(C= )printf( -=,elsepoin ter-;printf(n);caseprintfcase /readChar(n );break;();if( C=* )readChar();n ext_char

14、ac=buff po in ter ;while( C= *readCharn ext_characreadChar();printf(n);)else if( C=/ )readChar();while( C= n )readChar();printf(n);elsepoin ter-;printf(n);break;case %: printf(n );break;case (:printf(n );break;case ):printfcase :(n );break;printf(n );break;case :printf(n );break;case :printf(n );bre

15、akcase :printf(n );break;case :printf( :,冒号n);break;case ;:printf( ;,分号n);break;case ,:printf( ,逗号n);break;case .:printf(v.句号n);break;case ?printf( ?,问号n);break;case :printf(:readChar(D;if( C=)printf(v =,大于等于n);elsepoin ter-;printf(,break;case :readChar();if( C= )printf( =,elsepoin ter-;printf( ,bre

16、ak;case =:readChar();if( C= )printf( =,elsepoin ter-;printf( =,break;case &:readChar();if( C=& )printf( &,elsepoin ter-;printf( &break;case TreadChar();if( C=| )printf( |,elsepoin ter-;printf(n);小于等于n);小于n);判等n);赋值等n);且 n);取地址符n);或 n);运算符n);break;case !:readChar();if( C= )printf(n);elsepoin ter-;pri

17、n tf(n);break;printf(该源文件的行数为:%d单词数为%d字符数为 %d.n , row_num, word_num, letter_num );system (pause);return 0 ;3. 程序的执行结果测试程序为:include岸 includeTAin () idouble r,n,t,x,y,i,w;n=0;KI;r=a;i=l;y-1;w=o ;printf(Please onpat a float number:n); scanf,&x);while(r=le-3)n=n+L;匸=c+w;wliile in)X=XX;i=i+l;y=i w=x/y;r=

18、fabs(w);printf (The result is %. lf;syacem pauae M );return 0; 运行结果为:騎LX源文件的踣径二n. . cK k 一,句号爰M弃喜5 K A 大丁 IU ci. lc 7 A.谨号,逗号运号-逗号 # 分号 = 00 B0 f0J .: jA,J. . 000000.JL%r *77A s k080S000.000000, 0 ;,分号ID* 12 J左小括号 引号m is ID, 14 ID. 15 float,关键字ID. 16 -冒号弓冉 若小括号 -分号ID. 17 引号,取模ID. 18 引号 亠逗号S取地址符ID. 8

19、 *若小括号 -努号 while.丢键字1D* 5 I大于等于1.000030,. 1 000000ID. S 巳赋值等 ID# S *,乘号 ID. 8 ;,分号 id. ie 匕喩值等 ID# 10 4加号 1.000000 1 匚分号 ID, 9 巳值等 ID, 10 乘号 ID. 9 H分号 儿右大括号 ID. 11 3赋值等 m s 厶除号 ID, 9 0 -左关括号ID* 6 r赋值等ID, 6 +,加号 1-U09000, 1 ;分号ID 7 =,赋值等ID, 7 +加号ID, 11 分号 while,关犍芍左小括号ID. 18 J小于ID. 6 m 24 ,引号4逗号 m ? -右小括号 j分号 m 25 引号 m 儿翹逬号return,关键字0.000000 0 5-分号讀黔 25(单词数为叽 字符数为沁四、有待改进的地方

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 施工组织

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁