编译原理—词法分析器实验报告
张雅梅(10072510308)
一、实验目的:
1.设计、编制、调试一个词法分析子程序-识别
单词
英语单词 下载七年级上册英语单词表下载英语单词表下载深圳小学英语单词表 下载高中英语单词 下载
,加深对词法分析原理的理解。
2.掌握在对程序设计语言的源程序扫描的过程中,将其分解后各类单词的语法分析方法。
二、实验要求:
1. 对给定的程序通过词法分析器弄够识别一个个单词符号,并以二元式(单词种别码,单词符号的属性值)显示。而本程序则是通过对给定路径的文件的分析后以单词符号和文字提示显示。
2. 本程序自行规定:
(1)关键字"begin","end","if","then","else","while","write","read",
"do", "call","const","char","until","procedure","repeat"
(2)运算符:"+","-","*","/","="
(3)界符:"{","}","[","]",";",",",".","(",")",":"
(4)其他标记 如字符串,表示以字母开头的标识符。
(5)空格、回车、换行符跳过。
在屏幕上显示如下:
( 1 , 无符号整数)
( begin , 关键字 )
( if , 关键字 )
( +, 运算符 )
( ; , 界符 )
( a , 普通标识符 )
三、使用环境:
Window vista 下的 Visual Studio 2008;
四、实验步骤
查询资料,了解词法分析器的工作过程与原理。
分析题目,整理出基本设计思路。
实践编码,将设计思想转换用c语言编码实现,编译运行。
4.测试功能,多次设置包含不同字符,关键字的待解析文件,仔细察看运行结果,检测该分析器的分析结果是否正确。通过最终的测试发现问题,逐渐完善代码中设置的分析对象与关键字表,拓宽分析范围提高分析能力。
五、流程图
五、调试程序:
1.举例说明
文件位置:C:\TEST.txt
目标程序如下:
Int main()
{
i=10;
j=100;
n=1;
sum=0;
mult=1;
while (i>0) {n=n+1;i=i-1;}
if (j>=50) then sum=sum+j; else {mult=mult*(j+1);sum=sum+i;}
if (i<=10) then sum=sum-i; else mult=mult+i/2;
if (i==j) then sum=sum-j; else mult=mult-j/2;
if (n>1) then n=n-1; else n=n+1;
if (n<2) then n=n+2; else n=n-2;
}
2.运行结果:
六、程序源代码:
#include
#include
using namespace std;
#define MAX 22
char ch =' ';
string key[15]={"begin","end","if","then","else","while","write","read",
"do", "call","const","char","until","procedure","repeat"};
int Iskey(string c){ //关键字判断
int i;
for(i=0;i='a'))||((c<='Z')&&(c>='A'))) return 1;
else return 0;
}
int IsDigit(char c){ //判断是否为数字
if(c>='0'&&c<='9') return 1;
else return 0;
}
void analyse(FILE *fpin){
string arr="";
while((ch=fgetc(fpin))!=EOF) {
arr="";
if(ch==' '||ch=='\t'||ch=='\n'){}
else if(IsLetter(ch)){
while(IsLetter(ch)||IsDigit(ch)) {
if((ch<='Z')&&(ch>='A')) ch=ch+32;
arr=arr+ch;
ch=fgetc(fpin);
}
fseek(fpin,-1L,SEEK_CUR);
if (Iskey(arr)){cout<' :{ch=fgetc(fpin);
if(ch=='=') cout<<">="<<"\t$运算符"<')cout<<">>"<<"\t$输入控制符"<"<<"\t$运算符"<') cout<<"<>"<<"\t$运算符"<>in_fn;
if((fpin=fopen(in_fn,"r"))!=NULL) break;
else cout<<"文件路径错误!请输入源文件名(包括路径和后缀名):";
}
cout<<"\n********************分析如下*********************"<>a;
}
六、实验心得:
通过此次实验,让我了解到如何设计、编制并调试词法分析程序,加深对词法分析原理的理解;熟悉了构造词法分析程序的手工方式的相关原理,使用某种高级语言(例如C++语言)直接编写此法分析程序。另外,也让我重新熟悉了C++语言的相关内容,加深了对C++语言的用途的理解。在本次实验中,我纠正了一个一直以来的概念错误:main不是关键字,它定义为程序的入口,是主函数!在本实验中,虽然我把main初始化在关键字表
(字符指针类型数组)*Key[10]中,当与该数组中字符串进行比较时,若与main匹配成功,则返回2,若为其他关键字则返回1,以此来把main从关键字中区别出来。
在本实验中的关键字表只初始化了几个常用的关键字,还可继续扩充(只需扩大数组,向其中补充要添加的关键字)。
_1234567890.vsd
�
�
�
�
开始
输入源文件路径
路径是否有效
初始化文件指针
将字符加入字符数组Word[]
是
否
是空格,空白或换行吗
是字母吗
否
否
是数字吗
是界符吗
否
打开源文件
跳过该字符
是
是
文件结束?
否
将字符加入字符数组Word[]
将字符加入字符数组Word[]
否
将字符加入字符数组Word[]
是
指向下一字符
识别指针内容
指向下一字符
是字母惑数字吗
将word与关键字表key进行匹配
是
否
匹配?
输出word为关键字
是
输出word为普通标示符
否
回退
是数字吗
将字符加入字符数组Word[]
指向下一字符
输出word为常数
识别指针内容
是
否
输出word为界符
指向下一字符
结束
是
输出Word内容为不可识别