实验一词法分析报告_第1页
实验一词法分析报告_第2页
实验一词法分析报告_第3页
实验一词法分析报告_第4页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

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

文档简介

1、.实验一词法分析1 实验要求(1 )从源程序文件中读取有效字符并将其转换成二元组内部表示形式输出。( 2 )掌握词法分析的实现方法 。( 3)实验时间 4 学时 。( 4 )实验完成后 ,要提交实验报告 (包括源程序清单 )。2 实验内容2.1 主程序设计考虑:主程序的说明部分为各种表格和变量安排空间(关键字和特殊符号表)。id 和 ci 数组分别存放标识符和常数;还有一些为造表填表设置的变量。主程序的工作部分建议设计成便于调试的循环结构。每个循环处理一个单词;调用词法分析过程 ;输出每个单词的内部码(种别编码 ,属性值 )。 建议从文件中读取要分析的符号串 。2.2 词法分析过程考虑该过程根

2、据输入单词的第一个有效字符(有时还需读第二个字符), 判断单词种别,产生种别编码。对于标识符和常数,需分别与标识符表和常数表中已登记的元素相比较,如表中已有该元素,则记录其在表中的位置,如未出现过,将标识符按顺序填入数组id中,将常数存入数组中ci 中,并记录其在表中的位置。编号12345678910名字intcharfloatvoidconstifelsedowhilescanf编号11121314151617181920.专业 .专注. .名字printfreturnmain. .read+*/%=编号21222324252627282930名字= =><! =>=<

3、;=&&|!<>编号31323334353637383940名字();,“+-三:主流程图如下 :常数分析程序入口开工操作读源程序字符是字母?YNY是数字?N其它单词关键字和标识符分析程序分析程序输出单词的内部表示Y是有字符?N出口.专业 .专注.四:实验思路( 1)我首先把这个单词的种类分成了五类 ,包括:关键字、标识符、常数、算符、界符。然后利用状态转换图进行单词的识别( 2)对于关键字 、算符、界符 。因为这些单词的个数有限 。所以我单独给每个单词一个种别编码 。 能够做到每个单词的种别编码是不一样的 。 而对于常数和标识符 ,我先把它们分别单独的作为一类,然

4、后定义一个二维数组,分别存放这个单词的名称和编码。而这个编码就是这个单词在这个二维数组中的位置;当遇到新的标识符或常数,就把这个单词放入到相应的数组中。( 3)然后构造一个状态转换图的程序。把每次得到的单词先暂时存放在temp二维数组中 。然后用这个临时的二维数组去确定这个单词是何种类别五:实验代码usingSystem;usingusingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingusing.专业 .专注.namespaceWordpubl

5、icpartialclass Form1: FormpublicForm1()InitializeComponent();charreceive;/ 从输入得到的源程序charch;/ 这是从源程序读取的一个字符stringcache;/ 暂存的单词intindex;/ 记录取到哪个位置了key_wordtemp;/ 用来临时存放得到这个单词structkey_wordpublicstringkey_name;publicintnumber;structnum_wordpublicstringnum_name;publicintnumber;.专业 .专注.structID_wordpubli

6、cstringID_name;publicintnumber;publicintnum_index;publicintID_index;DataTabledt;privatevoidbutton1_Click(objectsender,EventArgse)dt= newDataTable();助记符 ");外部编码 ");内部编码 ");类型 ");receive=index= 0;num_index=0;ID_index=0;.专业 .专注.while(index<receive.Length)cache = null;Get_Word();i

7、f (temp.number=1)inti = 0;intflag=0;if (num_index=0)Numnum_index.num_name=temp.key_name;Numnum_index.number= num_index;num_index+;elsefor(i =0; i <num_index;i+)if(Numi.num_name=temp.key_name)flag=i;.专业 .专注.break;if (i >=num_index)Numnum_index.num_name= temp.key_name;Numnum_index.number=num_ind

8、ex;flag= num_index;num_index+;DataRowdr= dt.NewRow();dr" 助记符 " =temp.key_name;dr" 外部编码 "= temp.number;dr" 内部编码 "= +Numflag.number;dr" 类型 " ="常数 "else if (temp.number=0)inti = 0;intflag=0;.专业 .专注.if (ID_index=0)IDID_index.ID_name= temp.key_name;IDID_i

9、ndex.number=ID_index;ID_index+;elsefor(i =0; i <ID_index;i+)if(IDi.ID_name=temp.key_name)flag=i;break;if (i >=ID_index)IDID_index.ID_name= temp.key_name;IDID_index.number=ID_index;flag= ID_index;ID_index+;.专业 .专注.DataRowdr= dt.NewRow();dr" 助记符 " =temp.key_name;dr" 外部编码 "= t

10、emp.number;dr" 内部编码 "= IDflag.number;dr" 类型 " ="标识符 "elseDataRowdr= dt.NewRow();dr" 助记符 " =temp.key_name;dr" 外部编码 "= temp.number;if (temp.number>=15 &&temp.number<=30)dr" 类型 "= "运算符 "else if(temp.number>=31 &&

11、amp;temp.number<=40)dr" 类型 "= "界符 ".专业 .专注.elsedr" 类型 "= "关键字 "= dt;key_wordKey;num_wordNum;ID_wordID;privatevoidForm1_Load(objectsender,EventArgse)index= 0;Key = newkey_word41;Key0.key_name="$ID"Key0.number=0;/ 标识符Key1.key_name="$INT"Ke

12、y1.number=1;/ 数Key2.key_name="int"Key2.number=2; Key3.key_name= "float"Key3.number= 3;Key4.key_name="void"Key4.number= 4; Key5.key_name= "con.专业 .专注.st" Key5.number= 5; Key6.key_name="if"Key6.number= 6; Key7.key_name= "else"Key7.number= 7;K

13、ey8.key_name="do"Key8.number= 8; Key9.key_name= "while"Key9.number= 9; Key10.key_name= "scanf"Key10.number= 10; Key11.key_name= "printf"Key11.number=11;Key12.key_name= "return"Key12.number=12; Key13.key_name="main"Key13.number= 13; Key14.ke

14、y_name= "read"Key14.number= 14;Key15.key_name= "+"Key15.number=15;Key16.key_name= "-"Key16.number=16; Key17.key_name= "*"Key17.number= 17; Key18.key_name= "/"Key18.number=18; Key19.key_name= "%"Key19.number= 19;Key20.key_name="="K

15、ey20.number= 20; Key21.key_name="="Key21.number= 21; Key22.key_name= ">" Key22.number= 22; Key23.key_name ="<"Key23.number=23;Key24.key_name="!="Key24.number= 24; Key25.key_name=">="Key25.number= 25; Key26.key_name= "<="Key26.nu

16、mber= 26; Key27.key_name= "&&"Key27.number=27;Key28.key_name="|"Key28.number=28; Key29.key_name="!"Key29.number=29; Key30.key_name ="<>"Key30.number=30;Key31.key_name="("Key31.number=31;Key32.key_name=")"Key32.number=32; Key33

17、.key_name="".专业 .专注.Key33.number= 33;Key34.key_name=""Key34.number=34;Key35.key_name=""Key35.number= 35;Key36.key_name=","Key36.number=36;Key37.key_name=""" Key37.number= 37; Key38.key_name = "'" Key38.number = 38; Key39.key_name =

18、 "+" Key39.number=39;Key40.key_name="-"Key40.number=40;Num=newnum_word1024;ID = newID_word1024;publicvoidGetChar()/ 得到一个字符if (index<receive.Length)ch =receiveindex;index+;elsech ='0'.专业 .专注.publicvoidGetNotKong()/ 得到一个不是空的字符while(index<receive.Length)ch=receiveindex

19、;index+;if(ch!= ' ' && ch != 'r' && ch != '0' && ch != 'n')break;publicvoidConCat()/ 连接cache+=ch;publicboolIsLetter()/ 判断是不是字母if (ch >='A' &&ch <='Z' | ch >='a'&&ch <='z').专业 .专注.retur

20、ntrue;elsereturnfalse;publicboolIsDigit()/ 判断是不是数字if (ch >='0' &&ch <='9')returntrue;elsereturnfalse;publicintGet_Number()/ 得到这个单词的编码for(inti =0; i < 41; i+).专业 .专注.if (string.Equals(cache,Keyi.key_name)returnKeyi.number;return0;publicvoidretrace()/ 退回一个单词if (ch !=&#

21、39;0')index-;privatevoidGet_Word()intcount;GetNotKong();if (ch >='A'&&ch <='Z' | ch >='a'&&ch <='z').专业 .专注.ConCat();GetChar();while(IsLetter()| IsDigit()ConCat();GetChar();retrace();count= Get_Number();temp.key_name= cache;if (count=0)

22、temp.number=0;elsetemp.number=Keycount.number;.专业 .专注.else if (ch >='0'&&ch <='9')ConCat();GetChar();while(IsDigit()ConCat();GetChar();retrace();temp.key_name= cache;temp.number= 1;else if (ch ='+')ConCat();GetChar();if (ch ='+')ConCat();temp.key_name= c

23、ache;.专业 .专注.temp.number=39;elseretrace();temp.key_name= cache;temp.number=Get_Number();else if (ch ='-')ConCat();GetChar();if (ch ='-')ConCat();temp.key_name= cache;temp.number=40;elseretrace();.专业 .专注.temp.key_name= cache;temp.number=Get_Number();else if (ch ='<')ConCat(

24、);GetChar();if (ch ='=')ConCat();temp.key_name= cache;temp.number=26;elseretrace();temp.key_name= cache;temp.number=Get_Number();else if (ch ='>').专业 .专注.ConCat();GetChar();if (ch ='=')ConCat();temp.key_name= cache;temp.number=25;elseretrace();temp.key_name= cache;temp.num

25、ber=Get_Number();else if (ch ='=')ConCat();GetChar();if (ch ='=').专业 .专注.ConCat();temp.key_name= cache;temp.number=21;elseretrace();temp.key_name= cache;temp.number=Get_Number();else if (ch ='!')ConCat();GetChar();if (ch ='=')ConCat();temp.key_name= cache;temp.number=24;else.专业 .专注.retrac

温馨提示

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

评论

0/150

提交评论