实验一词法分析报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一词法分析
1.实验要求
(1)从源程序文件中读取有效字符并将其转换成二元组内部表示形式输出。
(2)掌握词法分析的实现方法。
(3)实验时间4学时。
(4)实验完成后,要提交实验报告(包括源程序清单)。
2.实验内容
2.1主程序设计考虑:
主程序的说明部分为各种表格和变量安排空间(关键字和特殊符号表)。
id 和ci 数组分别存放标识符和常数;还有一些为造表填表设置的变量。
主程序的工作部分建议设计成便于调试的循环结构。每个循环处理一个单词;调用词法分析过程;输出每个单词的内部码(种别编码,属性值)。建议从文件中读取要分析的符号串。
2.2词法分析过程考虑
该过程根据输入单词的第一个有效字符(有时还需读第二个字符),判断单词种别,产生种别编码。对于标识符和常数,需分别与标识符表和常数表中已登记的元素相比较,如表中已有该元素,则记录其在表中的位置,如未出现过,将标识符按顺序填入数组id 中,将常数存入数组中ci 中,并记录其在表中的位置。
三:主流程图如下:
四:实验思路
(1)我首先把这个单词的种类分成了五类,包括:关键字、标识符、常数、算符、界符。然后利用状态转换图进行单词的识别
(2)对于关键字、算符、界符。因为这些单词的个数有限。所以我单独给每个单词一个种别编码。能够做到每个单词的种别编码是不一样的。而对于常数和标识符,我先把它们分别单独的作为一类,然后定义一个二维数组,分别存放这个单词的名称和编码。而这个编码就是这个单词在这个二维数组中的位置;当遇到新的标识符或常数,就把这个单词放入到相应的数组中。
(3)然后构造一个状态转换图的程序。把每次得到的单词先暂时存放在temp 二维数组中。然后用这个临时的二维数组去确定这个单词是何种类别
五:实验代码
using System;
using System.Collections.Generic;
using ponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.T asks;
using System.Windows.Forms;
namespace Word
{
public partial class Form1 : Form
{
public Form1()
{
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;
public int number;
}
public int num_index;
public int ID_index;
DataT able dt;
private void button1_Click(object sender, EventArgs e) {
dt = new DataT able();
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 < receive.Length)
{
cache = null;
Get_Word();
if (temp.number == 1)
{
int i = 0;
int flag = 0;
if (num_index == 0)
{
Num[num_index].num_name = temp.key_name;
Num[num_index].number = num_index;
num_index++;
}
else
{
for (i = 0; i < num_index; i++)
{
if (Num[i].num_name == temp.key_name)
{
flag = i;
}
}
if (i >= num_index)
{
Num[num_index].num_name = temp.key_name;
Num[num_index].number = num_index;
flag = num_index;
num_index++;
}
}
DataRow dr = dt.NewRow();
dt.Rows.Add(dr);
dr["助记符"] = temp.key_name;
dr["外部编码"] = temp.number;
dr["内部编码"] = +Num[flag].number;
dr["类型"] = "常数";
}
else if (temp.number == 0)
{
int i = 0;
int flag = 0;