编译原理-词法分析器

  • 格式:doc
  • 大小:209.50 KB
  • 文档页数:11

词法分析程序一、实验目的通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。

并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。

编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。

并依次输出各个单词的类型码及单词符号的自身值。

(遇到错误时可显示“Error”,然后跳过错误部分继续显示)二、实验要求用C或C++写一个简单的词法分析程序,程序可以满足下列要求:1、能分析如下几种简单的语言词法(1) 标识符: ID=letter(letter|digit)*(2) 关键字(全部小写)main int float double char if then else switch case break continue while do for(3)整型常量:NUM=digit digit*(4)运算符: = + - * / < <= == != > >= ; ()? :(5)空格由空白、制表符和换行符组成,用以分隔ID、NUM、运算符等,字符分析时被忽略。

2、单词符号和相应的类别码假定单词符号和相应的类别码如下:单词符号种别码int 1 = 17 float 2 < 20 if 3 <= 21 switch 4 == 22 while 5 != 23 Do 6 > 24标识符 10 >= 25 整型常量 11 ; 26 + 13 ( 27- 14 ) 28 * 15 ? 29 / 16 : 303、词法分析程序实现的功能输入:单词序列(以文件形式提供),输出识别的单词的二元组序列到文件和屏幕输出:二元组构成:(syn,token或sum)其中: syn 为单词的种别码token 为存放的单词自身符号串sum 为整型常数例:源程序: int ab; float ef=20;ab=10+ef;输出:(保留字--1,int) (标识符--10,ab) (分号--26,;)(保留字--2,float) (标识符--10,ef) (等号--17,=)(整数--11,20) (分号--26,;) (标识符--10,ab)(等号--17,=) (整数--11,10) (加号--13,+)(标识符--10,ef) (分号--26,;)4、自己准备测试数据存放于TestData.txt文件中,测试数据中应覆盖有以上5种数据,测试结果要求以原数据与结果对照的形式输出并保存在Result.txt中,同时要把结果输出到屏幕。

5、提前准备①实验前,先编制好程序,上机时输入并调试程序。

②准备好多组测试数据(存放于文件TestData.txt中)。

6、写出实验报告报告格式:要求有实验名称、实验目的、实验要求、实验内容、实验小结。

其中实验内容包括算法分析、程序流程图及程序代码。

一,系统介绍本系统使用面象对象语言C#语言编写,对C语言源程序的一个词法分析的程序, 实现界面化,并且可以以手动输入,和导入等两种方式对源程序的输入.分析得到的分析结果,可以能过手动地保存在本地电脑中,也可以自动保存在”词法分析器\词法分析器\bin\Debug\Text”目录下.并且运行的结果可以在显示器上观看…分析部分算法:1.把文本的内容赋值为一个字符串2.从头到尾扫描这个字串,把它分为两类,一类为标识符,别一类为符号3.对标识符进行为类,分为关键字,数字,标准标识符和错误的字符串.分类方法为,先将其它为分数字与非数字.是数字则打印数字信息.不是数字则与关键字表对照,有则打印关键字信息,无则再根据标识符的规则判断是否为标识符,是则打印标识符信息,不是则打印错误信息.4.对符号进行分类,分为运算符和界符,分类方法为用现有的字符串与标准的种别码进行比较,有则打印相应信息,无则打印错误信息.5.最后统计错误信息,并且保存相应的源文件与分析结果文件三,调试运行:界面四,原码:using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.IO;namespace词法分析器{public partial class词法分析器 : Form{public string path1 = "", path2 = "";//路径1,路径2public词法分析器(){InitializeComponent();}private void ListViewer_Load(object sender, EventArgs e) //Load{this.saveFiles.Enabled = false; //控件隐藏this.button1.Enabled = false;bel1.Visible = false;bel2.Visible = false;this.linkLabel1.Visible = false;this.linkLabel2.Visible = false;}//打开文件的函数private void openFiles_Click(object sender, EventArgs e){openFileDialog1.InitialDirectory = "";openFileDialog1.Title = "请选择文件";openFileDialog1.FileName = "";openFileDialog1.Filter = "文本文档(*.txt)|*.txt";if (openFileDialog1.ShowDialog() != DialogResult.Cancel){System.IO.StreamReader sr = newSystem.IO.StreamReader(openFileDialog1.FileName);this.textBox1.Text = sr.ReadToEnd();sr.Close();sr.Dispose();}bel1.Visible = false; //控件隐藏bel2.Visible = false;this.linkLabel1.Visible = false;this.linkLabel2.Visible = false;}//保存源文件的函数private void saveFiles_Click(object sender, EventArgs e){string stringTemp = this.textBox1.Text;saveFileDialog1.Title = "请输入要保存的文件名";saveFileDialog1.Filter = "文本文档(*.txt)|*.txt";saveFileDialog1.OverwritePrompt = true;if (saveFileDialog1.ShowDialog() == DialogResult.OK){path1 = saveFileDialog1.FileName;StreamWriter sw = new StreamWriter(path1);sw.Write(stringTemp);sw.Close();sw.Dispose();bel1.Visible = true;this.linkLabel1.Visible = true;this.linkLabel1.Text = path1.Substring(stIndexOf("\\") + 1); }this.saveFiles.Enabled = false;}private void button1_Click(object sender, EventArgs e) //保存结果{string[] stringTemp = new string[this.resultListBox1.Items.Count]; saveFileDialog1.Title = "请输入要保存的文件名";saveFileDialog1.Filter = "文本文档(*.txt)|*.txt";saveFileDialog1.OverwritePrompt = true;if (saveFileDialog1.ShowDialog() == DialogResult.OK){path2 = saveFileDialog1.FileName;StreamWriter sw = new StreamWriter(path2);for(int counter = 0; counter < this.resultListBox1.Items.Count; counter++) sw.WriteLine(this.resultListBox1.Items[counter].ToString()); sw.Close();sw.Dispose();bel2.Visible = true;this.linkLabel2.Visible = true;this.linkLabel2.Text = path2.Substring(stIndexOf("\\") + 1); }this.button1.Enabled = false;}private void save()//自动保存结果{try{bel1.Visible = true; //控件显示bel2.Visible = true;this.linkLabel1.Visible = true;this.linkLabel2.Visible = true;string stringTemp1 = this.textBox1.Text; //保存源文件string date = DateTime.Now.ToString("HH-mm-ff");string zipath1 = "TestData(" + date + ").txt";path1 = Application.StartupPath + "\\Text\\" + zipath1;StreamWriter sw1 = new StreamWriter(path1);sw1.Write(stringTemp1);this.linkLabel1.Text = zipath1;sw1.Close();sw1.Dispose();string zipath2 = "Result(" + date + ").txt";//保存分析结果path2 = Application.StartupPath + "\\Text\\" + zipath2;StreamWriter sw2 = new StreamWriter(path2);for(int counter = 0; counter < this.resultListBox1.Items.Count; counter++) sw2.WriteLine(this.resultListBox1.Items[counter].ToString());this.linkLabel2.Text = zipath2;sw2.Close();sw2.Dispose();}catch{MessageBox.Show("保存失败, 请手动保存!", "警告",MessageBoxButtons.OK, MessageBoxIcon.Warning);this.saveFiles.Enabled = true;this.button1.Enabled = true;bel1.Visible = false; //控件显示bel2.Visible = false;this.linkLabel1.Visible = false;this.linkLabel2.Visible = false;}}//分析函数private void BeginToAnalyse_Click(object sender, EventArgs e){if (MessageBox.Show("您要在分析完成后,自动保存分析结果吗?", "温馨提示", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes){//判断列表是否为空,否则清空列表if (this.resultListBox1.Items.Count != 0)this.resultListBox1.Items.Clear();char[] getch = textToCharArray();//字符数组。