



版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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 ,否则返回 falsebool digit();/布尔函数,判断 C 中的字符是否为数字,若是则返回true ,否则返回 falseint searchForKeywords();/查关键字表,若此函数的返回值为0,则表示
4、token 中的字符串是标识符,否则为关键字int searchForToken();/查符号表,若此函数的返回值为0,则表示 token 中的字符串是新出现的,否则为已出现过的标识符int searchForNum(); / 查常数表,若此函数的返回值为0,则表示 token 中的数字是新出现的,否则为已出现的常数void insertTokenList();/将标识符插入符号表void insertNumList();/将数字插入常数表void fillBuffer(int a);/填充 buff 的半区函数.2程序源代码#include<stdio.h>#include<
5、;stdlib.h>#include<string.h>#include<math.h>int pointer=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 , f
6、ile_name 20;charkeywords 32 10= "auto", "break", "case" , "char", "const", "continue", "default", "do" , "double" , "else", "enum" , "extern", "float", "for", &
7、quot;goto", "if", "int", "long", "register", "return", "short", "signed", "sizeo", "fstatic", "struct", "switch", "typedef", "union", "unsigned" , "vo
8、id", "volatile", "while"double num ;FILE * file_pointer;void fillBuffer( int a) /i=0;while(!feof ( file_pointer)&& i <2048 ) /buff a+i = charac ;if(charac != ' ') /if(charac ='n')row_num+; /elseletter_num+;charac=fgetc( file_pointer);i+;.if(feof (
9、file_pointer)buff a+i = '0'void readChar() /C=buff pointer;if(pointer=1023) /fillBuffer( 1024); /pointer+; /elseif(pointer=2047) /fillBuffer( 0); /pointer=0; /elsepointer+;void ignoreSpace() /if(C=' '| C='n'| C='t')C=buff pointer;if(pointer=1023) /fillBuffer( 1024); /
10、pointer+; /elseif(pointer=2047) /fillBuffer( 0); /pointer=0; /elsepointer+;ignoreSpace();void link() /token j += C;bool alphabet() /.if(C>=97 && C <=122)|(C>=65 && C<=90)returntrue;elsereturnfalse;bool digit() /if(C>=48 && C <=57)returntrue;elsereturnfalse;i
11、nt searchForKeywords() /for(int x=0; x<32; x+)if(strcmp ( token , keywords x )= 0)return0;/return1 ;int searchForToken() /int i=0;while(i <=c - 1)if(strcmp ( token , token_list i )= 0)appear=i ;return0 ; /i +;word_num+;return1 ;int searchForNum() /int i=0;while(i <=d- 1)if(strcmp ( token ,
12、number i )= 0)num_location=i ;.return0 ; /i +;word_num+;return1 ;void insertTokenList() /strcpy( token_list c+, token );void insertNumList() /strcpy( number d+, token );main ()printf( " 输入源文件的路径:n");scanf( "%s", file_name);file_pointer=fopen ( file_name, "r" );if(file_p
13、ointer=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 :case 79 :case 80
14、: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: ca
15、se 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( "< ID, %d >
16、;n", c- 1);elseprintf( "< ID, %d >n", appear ); /elseprintf( "< %s,?>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()
17、;if(C='.')link();readChar();while(digit()link();num=num+( C- 48)* pow( 0.1 , z +); /readChar();token j = '0' /j=0; /pointer-;if(searchForNum ()= 1) /insertNumList();/printf( "< %f, %d >n", num, d- 1);else.printf( "< %f, %d >n", num, num_location); / br
18、eak;case '+':readChar();if(C='=' )printf( "< +=,赋值运算符>n");elseif(C='+')printf( "< +,自加 >n" );elsepointer-;printf( "< +,加号 >n");break;case '-':readChar();if(C='-')printf( "< -,自减 >" );elseif(C='
19、;=')printf( "< -= ,赋值运算符>n" );elsepointer-;printf( "< -,减号 >n");break;case '*':printf( "< *,乘号 >n");break;case '/':readChar();if(C='*')readChar();next_charac=buff pointer;while(C!= '*'&& next_charac!= '/&
20、#39;)readChar();next_charac=buff pointer;readChar();printf( "< /*,多行注释>n");elseif(C='/').readChar();while(C!= 'n')readChar();printf( "< /,单行注释 >n");elsepointer-;printf("< /,除号 >n");break;case '%':printf("<%,取模 >n"
21、; );break;case'(':printf("<(,左小括号 >n");break;case')':printf("< ),右小括号 >n");break;case'':printf("< ,左中括号 >n");break;case'':printf("< ,右中括号 >n");break;case'':printf("< , -左大括号 >n");b
22、reak;case'':printf("< ,右大括号 >n");break;case':':printf("< :,冒号 >n");break;case'':printf("< ;,分号 >n");break;case',':printf("< ,逗号 >n");break;case'.':printf("< .,句号 >n");break;case
23、39;?':printf("< ?,问号 >n");break;case'"':printf( "< "",引号 >n" );break;case '#':printf("< #,井号 >n");break;case '>':readChar();if(C='=')printf( "< >=,大于等于 >n");.elsepointer-;printf( "< >,大于 >n");break;case '<':readChar();if(C='=' )printf( "< <=,小于等于>n");elsepoint
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025公司项目部负责人安全培训考试试题(下载)
- 2025年承包商入厂安全培训考试试题及完整答案【各地真题】
- 2025年项目部安全培训考试试题答案典型题
- 【部编版】四年级语文下册第20课《我们家的男子汉》精美课件
- 【部编版】四年级语文下册第10课《绿》精美课件
- 2025职场攻略:求职过程中如何识破并规避“陷阱”合同的综合指导
- 2025公寓租赁合同样本
- 2025热水供应合同
- 2025版权转让合同样本参考
- 2025网站开发合同范本参考
- CRPS电源设计向导 CRPS Design Guide r-2017
- GB/T 9345.1-2008塑料灰分的测定第1部分:通用方法
- GB/T 3452.2-2007液压气动用O形橡胶密封圈第2部分:外观质量检验规范
- 化工废气处理技术课件
- 四川省自贡市各县区乡镇行政村村庄村名居民村民委员会明细及行政区划代码
- 卷烟厂电气专业笔试题
- 小学劳动课《劳动安全教育》
- 畸形舌侧沟临床对策培训课件
- 标准变压器用电负荷计算表
- DB12∕T 822-2018 路用高粘结力环氧乳化沥青技术要求
- “两票三制”专项整治工作方案(含检查表)
评论
0/150
提交评论