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

下载本文档

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

文档简介

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

2、字符),判断单词种别,产生种别编码。对于标识符和常数,需分别与标识符表和常数表中已登记的元素相比较,如表中已有该元素,则记录其在表中的位置,如未出现过,将标识符按顺序填入数组 id 中,将常数存入数组中 ci 中,并记录其在表中的位置。编号12345678910名字intcharfloatvoidconstifelsedowhilescanf编号11121314151617181920名字printfreturnmainread+*/%=编号21222324252627282930名字= =><!=>=<=&&|!<>编号3132333435

3、3637383940名字();,“+-三:主流程图如下: 四:实验思路(1) 我首先把这个单词的种类分成了五类,包括:关键字、标识符、常数、算符、界符。然后利用状态转换图进行单词的识别(2) 对于关键字、算符、界符。因为这些单词的个数有限。所以我单独给每个单词一个种别编码。能够做到每个单词的种别编码是不一样的。而对于常数和标识符,我先把它们分别单独的作为一类,然后定义一个二维数组,分别存放这个单词的名称和编码。而这个编码就是这个单词在这个二维数组中的位置;当遇到新的标识符或常数,就把这个单词放入到相应的数组中。(3) 然后构造一个状态转换图的程序。把每次得到的单词先暂时存放在temp二维数组中

4、。然后用这个临时的二维数组去确定这个单词是何种类别五:实验代码using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace Word public partial class Form1 : Form public Form1()

5、InitializeComponent(); char receive; /从输入得到的源程序 char ch; /这是从源程序读取的一个字符 string cache; /暂存的单词 int index; /记录取到哪个位置了 key_word temp; /用来临时存放得到这个单词 struct key_word public string key_name; public int number; struct num_word public string num_name; public int number; struct ID_word public string ID_name;

6、public int number; public int num_index; public int ID_index; DataTable dt; private void button1_Click(object sender, EventArgs e) dt = new DataTable(); dt.Columns.Add("助记符"); dt.Columns.Add("外部编码"); dt.Columns.Add("内部编码"); dt.Columns.Add("类型"); receive = text

7、Box1.Text.ToCharArray(); index = 0; num_index = 0; ID_index = 0; while (index < receive.Length) cache = null; Get_Word(); if (temp.number = 1) int i = 0; int flag = 0; if (num_index = 0) Numnum_index.num_name = temp.key_name; Numnum_index.number = num_index; num_index+; else for (i = 0; i < nu

8、m_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_index; flag = num_index; num_index+; DataRow dr = dt.NewRow(); dt.Rows.Add(dr); dr"助记符" = temp.key_name; dr"外部编码" = temp.number

9、; dr"内部编码" = +Numflag.number; dr"类型" = "常数" else if (temp.number = 0) int i = 0; int flag = 0; if (ID_index = 0) IDID_index.ID_name = temp.key_name; IDID_index.number = ID_index; ID_index+; else for (i = 0; i < ID_index; i+) if (IDi.ID_name = temp.key_name) flag = i;

10、 break; if (i >= ID_index) IDID_index.ID_name = temp.key_name; IDID_index.number = ID_index; flag = ID_index; ID_index+; DataRow dr = dt.NewRow(); dt.Rows.Add(dr); dr"助记符" = temp.key_name; dr"外部编码" = temp.number; dr"内部编码" = IDflag.number; dr"类型" = "标识符

11、" else DataRow dr = dt.NewRow(); dt.Rows.Add(dr); dr"助记符" = temp.key_name; dr"外部编码" = temp.number; if (temp.number >= 15 && temp.number <= 30) dr"类型" = "运算符" else if (temp.number >= 31 && temp.number <= 40) dr"类型" = &

12、quot;界符" else dr"类型" = "关键字" this.dataGridView1.DataSource = dt; key_word Key; num_word Num; ID_word ID; private void Form1_Load(object sender, EventArgs e) index = 0; Key = new key_word41; Key0.key_name = "$ID" Key0.number = 0; /标识符 Key1.key_name = "$INT"

13、; Key1.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 = "const" Key5.number = 5; Key6.key_name = "if" Key6.number = 6; Key7.key_name = "else&qu

14、ot; Key7.number = 7; Key8.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 =

15、 "main" Key13.number = 13; Key14.key_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_

16、name = "%" Key19.number = 19; Key20.key_name = "=" Key20.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; Key

17、25.key_name = ">=" Key25.number = 25; Key26.key_name = "<=" Key26.number = 26; Key27.key_name = "&&" Key27.number = 27; Key28.key_name = "|" Key28.number = 28; Key29.key_name = "!" Key29.number = 29; Key30.key_name = "<>"

18、;Key30.number = 30; Key31.key_name = "(" Key31.number = 31; Key32.key_name = ")" Key32.number = 32; Key33.key_name = "" Key33.number = 33; Key34.key_name = "" Key34.number = 34; Key35.key_name = "" Key35.number = 35; Key36.key_name = "," Ke

19、y36.number = 36; Key37.key_name = """ Key37.number = 37; Key38.key_name = "'" Key38.number = 38; Key39.key_name = "+" Key39.number = 39; Key40.key_name = "-" Key40.number = 40; Num = new num_word1024; ID = new ID_word1024; public void GetChar() /得到一个字

20、符 if (index < receive.Length) ch = receiveindex; index+; else ch = '0' public void GetNotKong() /得到一个不是空的字符 while (index < receive.Length) ch = receiveindex; index+; if (ch != ' ' && ch != 'r' && ch != '0' && ch != 'n') break; pub

21、lic void ConCat() /连接 cache += ch; public bool IsLetter() /判断是不是字母 if (ch >= 'A' && ch <= 'Z' | ch >= 'a' && ch <= 'z') return true; else return false; public bool IsDigit() /判断是不是数字 if (ch >= '0' && ch <= '9')

22、 return true; else return false; public int Get_Number() /得到这个单词的编码 for (int i = 0; i < 41; i+) if (string.Equals(cache, Keyi.key_name) return Keyi.number; return 0; public void retrace() /退回一个单词 if (ch != '0') index-; private void Get_Word() int count; GetNotKong(); if (ch >= 'A&#

23、39; && ch <= 'Z' | ch >= 'a' && ch <= 'z') ConCat(); GetChar(); while (IsLetter() | IsDigit() ConCat(); GetChar(); retrace(); count = Get_Number(); temp.key_name = cache; if (count = 0) temp.number = 0; else temp.number = Keycount.number; else if (ch

24、>= '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 = cache; temp.number = 39; else retrace(); te

25、mp.key_name = cache; temp.number = Get_Number(); else if (ch = '-') ConCat(); GetChar(); if (ch = '-') ConCat(); temp.key_name = cache; temp.number = 40; else retrace(); temp.key_name = cache; temp.number = Get_Number(); else if (ch = '<') ConCat(); GetChar(); if (ch = 

26、9;=') ConCat(); temp.key_name = cache; temp.number = 26; else retrace(); temp.key_name = cache; temp.number = Get_Number(); else if (ch = '>') ConCat(); GetChar(); if (ch = '=') ConCat(); temp.key_name = cache; temp.number = 25; else retrace(); temp.key_name = cache; temp.number = Get_Number(); else if (ch = '=') ConCat(); GetChar(); if (ch = '=') ConCat(); temp.key_name = cache; temp.number = 21; else retrace(); temp.key_name = cache; temp.number = Get_Number(); else if (ch = '!') ConCat(); GetChar(); if (ch = '=') Co

温馨提示

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

评论

0/150

提交评论