1、实验一词法分析 实验一 词法分析1实验要求(1)从源程序文件中读取有效字符并将其转换成二元组内部表示形式输出。(2)掌握词法分析的实现方法。(3)实验时间4学时。(4)实验完成后,要提交实验报告(包括源程序清单)。2实验内容2.1主程序设计考虑:主程序的说明部分为各种表格和变量安排空间(关键字和特殊符号表)。id 和ci 数组分别存放标识符和常数;还有一些为造表填表设置的变量。主程序的工作部分建议设计成便于调试的循环结构。每个循环处理一个单词;调用词法分析过程;输出每个单词的内部码(种别编码,属性值)。建议从文件中读取要分析的符号串。2.2词法分析过程考虑该过程根据输入单词的第一个有效字符(有
2、时还需读第二个字符),判断单词种别,产生种别编码。对于标识符和常数,需分别与标识符表和常数表中已登记的元素相比较,如表中已有该元素,则记录其在表中的位置,如未出现过,将标识符按顺序填入数组 id 中,将常数存入数组中 ci 中,并记录其在表中的位置。编号12345678910名字intcharfloatvoidconstifelsedowhilescanf编号11121314151617181920名字printfreturnmainread+*/%=编号21222324252627282930名字= =&|!编号31323334353637383940名字();,“+-三:主流程图如下: 四
3、:实验思路(1)我首先把这个单词的种类分成了五类,包括:关键字、标识符、常数、算符、界符。然后利用状态转换图进行单词的识别(2)对于关键字、算符、界符。因为这些单词的个数有限。所以我单独给每个单词一个种别编码。能够做到每个单词的种别编码是不一样的。而对于常数和标识符,我先把它们分别单独的作为一类,然后定义一个二维数组,分别存放这个单词的名称和编码。而这个编码就是这个单词在这个二维数组中的位置;当遇到新的标识符或常数,就把这个单词放入到相应的数组中。(3)然后构造一个状态转换图的程序。把每次得到的单词先暂时存放在temp二维数组中。然后用这个临时的二维数组去确定这个单词是何种类别五:实验代码us
4、ing 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() InitializeComponent(); char recei
5、ve; /从输入得到的源程序 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; public int number; public int num
6、_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 = textBox1.Text.ToCharArray(); index = 0; num_index = 0; ID_index = 0; while (index rec
7、eive.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 = num_index) Numnum_index.num_name = temp.key_name; Numnum_index.number = num_index; flag = n
8、um_index; num_index+; DataRow dr = dt.NewRow(); dt.Rows.Add(dr); dr助记符 = temp.key_name; dr外部编码 = temp.number; 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 fo
9、r (i = 0; 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类型 = 标识符; else DataRow dr = dt.NewRow(); dt.Rows.Add(dr); dr助记符 = te
10、mp.key_name; dr外部编码 = temp.number; if (temp.number = 15 & temp.number = 31 & temp.number ; Key22.number = 22; Key23.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 =
11、 29; Key30.key_name = ;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 = ,; Key36.number = 36; Key37.key_name = ; Key37.nu
12、mber = 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() /得到一个字符 if (index receive.Length) ch = receiveindex; index+; else ch = 0; public void GetNotKong() /得到一个不
13、是空的字符 while (index = A & ch = a & ch = 0 & ch = 9) return true; else return false; public int Get_Number() /得到这个单词的编码 for (int i = 0; i = A & ch = a & ch = 0 & ch = 9) ConCat(); GetChar(); while (IsDigit() ConCat(); GetChar(); retrace(); temp.key_name = cache; temp.number = 1; else if (ch = +) ConCa
14、t(); GetChar(); if (ch = +) ConCat(); temp.key_name = cache; temp.number = 39; else retrace(); temp.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 =
15、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(); te
16、mp.key_name = cache; temp.number = Get_Number(); else if (ch = !) ConCat(); GetChar(); if (ch = =) ConCat(); temp.key_name = cache; temp.number = 24; else retrace(); temp.key_name = cache; temp.number = Get_Number(); else if (ch = &) ConCat(); GetChar(); if (ch = &) ConCat(); temp.key_name = cache;
17、temp.number = 27; else retrace(); temp.key_name = cache; temp.number = Get_Number(); else if (ch = |) ConCat(); GetChar(); if (ch = |) ConCat(); temp.key_name = cache; temp.number = 28; else retrace(); temp.key_name = cache; temp.number = Get_Number(); else ConCat(); temp.key_name = cache; temp.numb
18、er = Get_Number(); 六:实验截图(1)我测试的程序为void main() int a=20; int b=15;if(a=20)printf(A);if(b=20)printf(B);七:实验心得通过这次实验、我对于词法分析需要做的任务有了一个更加深刻的理解。将课本上的理论实践到实际上使我对课本有了很好的理解。但是,这次实验中我也发现了我很多的小缺点,这个实验也挺考验一个学生的分析能力的。因为这个实验需要做的判断是非常多的、稍微漏掉一点就有可能导致整个程序的错误。而且、开始的时候我还把实验给理解错了。这让我更加知道了做实验之前好好分析的重要性。因为如果连要求都没有搞明白就去做实验的话。带来的麻烦更多。今后一定多加注意。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1