C语言实现词法分析程序设计参考_第1页
C语言实现词法分析程序设计参考_第2页
C语言实现词法分析程序设计参考_第3页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、词法分析一、实验目的设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。二、实验要求2.1待分析的简单的词法(1 )关键字:begi n if the n while do end所有的关键字都是小写。(2)运算符和界符: = +-*/<<=<>>>= = ; ( ) #(3)其他单词是标识符(ID )和整型常数(SUM),通过以下正规式定义:ID = letter (letter | digit)*NUM = digit digit*(4) 空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字, 词法分析阶段通常被忽略

2、。2.2各种单词符号对应的种别码:表2.1各种单词符号对应的种别码单词符号种别码单词符号种别码bgin1否输入串结束:17If2= :18The n3<是20wile4<>21do5结束<=22end6>23*letter|digit ) lettet (10>=24dight dight*11=25+132614(27*15)28/16#02.3词法分析程序的功能:输入:所给文法的源程序字符串输出:其中:二元组(syn,token或sum)构成的序列。 syn为单词种别码;token为存放的单词自身字符串;sum为整型常数。例如:对源程序 begi n x

3、:=9: if x>9 then x:=2*x+1/3; end #的源文件,经过词法分析后输岀如下序列:(1,beg in )(10,x)(18,:=)(11,9)(26,;)(2,if)三词法分析程序的算法思想:、算法的基本任务是从字符串表示的源程序中识别岀具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。主程序示意图:3.1主程序示意图如图 3-1所示。其中初始包括以下两个方面:关键字表的初值。关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,

4、否则为一般标识符。关键 字表为一个字符串数组,其描述如下:Char *rwtab6 = “begin” ,“if” ,“then” ,“while” ,“do” ,“end” ,;置初值调用扫描子程序输出单词二元组图1-1(2 )程序中需要用到的主要变量为syn,token和sum3.2扫描子程序的算法思想:首先设置3个变量:token用来存放构成单词符号的字符串;sum用来整型单词;syn用来存放单词符号的种别码。扫描子程序主要部分流程如图1-2所示。变量初始化忽略空格是是 是否文件结束?返回否其他符号syn字母数字否对不同符号给syn=10岀相应的运算符、界符等符号报 错拼字符串是否关键字

5、?是为对应关键字的单词种别码拼数syn值syn=11返回图1-2四、词法分析程序的C语言程序源代码:#i nclude <stdio.h>#in elude <stri ng.h>char prog80,toke n 8,ch;int syn ,p,m, n,sum;char *rwtab6=eg in ,if,hen, while,do,e nd;sca ner();mai n()P=0;please in put a stri ng(e nd with '#'):/n);dosca nf(%c,& ch);progp+=ch;while(ch

6、!='#');p=0;dosca ner();switch(s yn)case 11:printf( % -10d )n,sum,syn);break;case -1:pri ntf(you have in put a wrong stri ngn); getch();exit(0);default: printf( % -10s )n,token,syn); break;while(syn!=0);getch();scaner() sum=0;for(m=0;m<8;m+)tokenm+=NULL;ch=progp+;m=0;while(ch=' ')|

7、(ch='n')ch=progp+; if(ch<='z')&&(ch>='a')|(ch<='Z')&&(ch>='A') while(ch<='z')&&(ch>='a')|(ch<='Z')&&(ch>='A')|(ch>='0')&&(ch<='9') tokenm+=ch;

8、ch=progp+;p-;syn=10;for(n=0;n<6;n+)if(strcmp(token,rwtabn)=0) syn=n+1;break;else if(ch>='0')&&(ch<='9') while(ch>='0')&&(ch<='9') sum=sum*10+ch -'0'ch=progp+;p-;syn=11;else switch(ch) case '<':tokenm+=ch;ch=progp+;if(c

9、h='=') syn=22; tokenm+=ch;else syn=20;p-; case '>':tokenm+=ch; ch=progp+; if(ch='=') syn=24; tokenm+=ch;else syn=23; p-; break;case '+': tokenm+=ch; ch=progp+; if(ch='+') syn=17; tokenm+=ch; else syn=13; p-; break;case '-':tokenm+=ch; ch=progp+; if(

10、ch=' -') syn=29; tokenm+=ch;else syn=14; p-; break;case '!':ch=progp+; if(ch='=') syn=21; tokenm+=ch; else syn=31;p-;break;case '=':tokenm+=ch; ch=progp+; if(ch='=') syn=25;tokenm+=ch; else syn=18;p-; break;case '*': syn=15; tokenm+=ch; break;case '

11、;/': syn=16; tokenm+=ch; break;case '(': syn=27; tokenm+=ch; break;case ')': syn=28; tokenm+=ch; break;case '': syn=5; tokenm+=ch; break;case '': syn=6; tokenm+=ch; break;case '': syn=26; tokenm+=ch; break;case '': syn=30; tokenm+=ch; break;case '#': syn=0; tokenm+=ch; break;case ':':syn=17; tokenm+=ch;default: syn= -1;break;token m+='0:五、结果分析:输入 begin x:=9: if x>9 then x:=2*x+1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论