电 子 科 技 大 学
实 验 报 告
合同管理的主要内容
学生姓名:爸爸 学 号:************* 指导教师:陈昆
实验地点:科研楼A-506 实验时间:2017-04-28
一、实验项目名称:词法分析器的设计与实现
二、实验学时:4学时
三、实验原理
1.编译程序要求对高级语言编写的源程序进行分析和合成,生成目标程序。词法分析是对源程序进行的首次分析,实现词法分析的程序为词法分析程序或词法分析器,也称扫描器。
2.词法分析的功能是:从左到右逐个地扫描源程序字符串,按照词法规则,识别出单词符号作为输出,对识别过程中发现的词法错误,输出相关的错误信息。
乡村英文3.识别出来的单词会采用某种中间表现形式,通常一个单词用一个二元式来表示:(单词类别,单词的属性)。
4.状态转换图简称转化图,是有限有向图,是设计词法分析器的有效工具。
四、实验目的
通过该实验,让同学们自己独立自主的设计词法分析器,使得同学们可以更好的掌握词法分析程序设计的原理及相应的程序设计方法,对编译这门课程也可以有更加深刻理解,同时还可以锻炼编程能力。
五、实验内容
实现求n!的极小语言的词法分析程序,返回二元式作为输出。
六、实验器材(设备、元器件)
1.操作系统:Windows XP
2.开发工具:VS2013
七、实验步骤
(1)在VS2013中创建工程;
(2)编写输入输出,初始化,错误处理等函数;
(3)建立相应的单词符号与种别对照表,根据状态转换图编写相应的处理函数;
(4)运行代码进行调试;
(5)编写测试需要的输入文件:.pas文件;
(6)生成.dyd文件。
八、实验数据及结果分析
日本民谣编码完成后将测试程序放入debug文件夹中,测试程序如下图:
代码运行成功后在debug文件夹中会产生对应的exe,在cmd中运行后,会在debug文件夹中生成后缀为dyd和err的文件,打开dyd如下图所示:
因为没有错误,所以对应的test1.err的文件为空
可以对源程序进行词法分析,如果有错给出出错信息和所在行数,如果无错则生成二元式文件。
九、实验结论
词法分析器的功能是:从左到右逐个的扫描源程序的字符串,按照词法规则,识别出单词符号作为输出,对识别过程中发现的词法错误,输出有关的错误信息。
十、总结及心得体会
通过本次实验,即对词法分析程序的设计,锻炼了自己的编程能力,同时加深了自己对词法分析器的理解和掌握以及对待编译这门课程的理解,提高了自己的动手能力,在编码的过程中也遇到了许多问题,例如如何解决产生的文件后端对齐等等问题,让我的编码能力在此次实验中得到了一定的提高。
十一、对本实验过程及方法、手段的改进建议
要先了解词法分析器的功能以及输入输出形式,熟练的掌握状态转化图。
报告评分:
指导教师签字:
实验参考源代码如下:
#include<stdio.h>
洋葱炒蛋怎么做#include<string.h>
#include<Windows.h>
#define MAX_COUNT 2048
#define ILLEGAL_CHAR_ERR 1
#define UNKNOWN_OPERATOR_ERR 2
char getnbc()
{
char ch;
ch = getchar();
while (1)
{
if (ch == '\r' || ch == '\t' || ch == ' ')
{
ch = getchar();
}
el
{
break;
}
}
return ch;
}
bool letter(char character)
{
if ((character >= 'a'&&character <= 'z') || (character >= 'A'&&character <= 'Z'))
return true;
el
return fal;
}
bool digit(char character)
{
if (越剧发源地character >= '0'&&character <= '9')
return true;
el
return fal;
}
void retract(char& character)
{
ungetc(character, stdin);
character = NULL;
}
int rerve(char* token)
{
if (strcmp(token, "begin") == 0)
return 1;
el if (strcmp(token, "end") == 0)
return 2;
el if (strcmp(token, "integer") == 0)
return 3;
el if (strcmp(token, "if") == 0)
return 4;
el if (strcmp(token, "then") == 0)
return 5;
el if (strcmp(token, "el") == 0)
return 6;
el if (strcmp(token, "function") == 0)
return 7;
el平行公理的推论 if (strcmp(token, "read") == 0)
return 8;
el if (strcmp(token, "write") == 0)
return 9;
el
return 0;
}
int symbol()
{
return 10;
}
int constant()
{
return 11;
}
void output(const char* token, int kindNum)
{
printf("%16s %2d\n", 幼儿绘本故事token, kindNum);
}
bool error(int lineNum, int errNum)
{
char* errInfo;
switch (西安游记errNum)
{
ca ILLEGAL_CHAR_ERR:
errInfo = "出现字母表以外的非法字符";
break;
ca UNKNOWN_OPERATOR_ERR: