资源描述:
《单词符号种别识别程序设计.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、实验二单词符号种别识别程序设计一、实验目的通过C语言词法分析程序的实现理解编译程序过程中词法分析对单词的种别识别过程。二、实验重难点单词识别三、实验内容与要求1.阅读教材P2-P3词法分析部分内容,明确词法分析的任务。2.阅读实验案例,明确实验要求、模块流程图和程序实现方案;3.参考实验案例,完成简单的词法分析程序设计。四、实验学时4课时五、实验设备与环境C语言编译环境六、实验案例1.待分析的简单的词法(1)关键字:beginifthenwhiledoend所有的关键字都是小写。(2)运算符和界符:=+-*/<<=<>>>==;
2、()#(3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义:ID=letter(letter
3、digit)*NUM=digitdigit*(4)空格由空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。2.各种单词符号对应的种别码见表6.1:表6.1各种单词符号对应的种别码单词符号种别码单词符号种别码begin1:17if2=18then3<20while4!=21do5<=22end6>23{7>=24}8==25++9;26lettet(letter
4、dig
5、it)*10(27dightdight*11)28+13--29-1430*15!31/16#01.词法分析程序的功能:输入:所给文法的源程序字符串。输出:二元组(syn,token或sum)构成的序列。其中:syn为单词种别码;token为存放的单词自身字符串;sum为整型常数。例如:对源程序beginx:=9;ifx>9thenx:=2*x+1/3;end#的源文件,经过词法分析后输出如下序列:(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)……2.词法分析程序的算法思想:算法的基本任务是从
6、字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。(1)主程序示意图:主程序示意图如图6-1所示。其中初值包括以下两个方面:Ø关键字表的初值:关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下:Char*rwtab[6]={“begin”,“if”,“then”,“while”,“do”,“end”,};置初值调
7、用扫描子程序输出单词二元组输入串结束否是结束图6-1主程序流程图Ø程序中需要用到的主要变量为syn,token和sum(1)扫描子程序的算法思想:首先设置3个变量:①token用来存放构成单词符号的字符串;②sum用来存放整型单词;③syn用来存放单词符号的种别码。扫描子程序主要部分流程如图6-2所示。变量初始化忽略空格是否文件结束?返回是否字母拼字符串数字其他运算符、符号界符等符号是否关键字?返回拼数否对不同符号给出相应的syn值报错syn=10是syn=1111syn为对应关键字的单词种别码图6-2扫描子程序算法流程图1.词
8、法分析程序的C语言程序源代码:#include#include#include#include#include#includecharprog[80],ch;intp,m,n;chartoken[8];intsyn,sum;char*rwtab[6]={"begin","if","then","while","do","end"};//关键字表初始化scaner();//声明一个函数名为scanser()的子函数ma
9、in(){p=0;printf("pleaseinputastring(endwith'#'):");do{scanf("%c",&ch);//用%c控制输入则空格等表示有效输入,用%S控制,空格等表示输入结束prog[p++]=ch;}while(ch!='#');//遇到“#”,输入结束p=0;do{scaner();switch(syn){case11:printf("(%-10d%5d)",sum,syn);/*种别为数字时;%-10d:表示输出共占10位,%5d共占5位,右对齐左端补空格*/break;ca
10、se-1:printf("youhaveinputawrongstring");getch();exit(0);default:printf("(%-10s%5d)",token,syn);break;}}while(syn!=0);//“#”,syn=