南昌大学编译原理实验报告-词法分析器

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

南昌大学实验报告一

学生姓名:学号:专业班级:网络工程091 实验类型:□验证█综合□设计□创新实验日期:2012-4-12 实验成绩:

实验1 词法分析程序的设计

一、实验目的

掌握计算机语言的词法分析程序的开发方法。

二、实验内容

编制一个能够分析三种整数、标识符、主要运算符和主要关键字的词法分析程序。

三、实验要求

1、根据以下的正规式,编制正规文法,画出状态图;

标识符<字母>(<字母>|<数字字符>)*

十进制整数(0 | (1|2|3|4|5|6|7|8|9))(0|1|2|3|4|5|6|7|8|9)*

如有余力,则进一步分析八进制和十六进制整数,其正规式如下:

八进制整数0(1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*

十六进制整数0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)*

运算符和界符+ - * / > < = <= >= ( ) ;{ }

关键字main if then else while do int (可根据需要添加)

2、根据状态图,设计词法分析函数int scan( ),完成以下功能:

1)从文本文件中读入测试源代码,根据状态转换图,分析出一个单词,

2)以二元式形式输出单词<单词种类,单词属性>

其中单词种类用整数表示:

0:标识符

1:十进制整数

2:八进制整数

3:十六进制整数

运算符和界符,关键字采用一字一符,不编码

其中单词属性表示如下:

标识符,整数由于采用一类一符,属性用单词表示

运算符和界符,关键字采用一字一符,属性为空

3、编写测试程序,反复调用函数scan( ),输出单词种别和属性。

四、实验环境

PC微机

DOS操作系统或Windows 操作系统

Turbo C 程序集成环境或Visual C++ 程序集成环境

五、实验步骤

1、根据正规式,画出状态转换图;

2、根据状态图,设计词法分析算法;

3、采用C或C++语言,设计函数scan( ),实现该算法;

4、编制测试程序(主函数main);

5、调试程序:读入文本文件program.txt,运行程序得到输出结果result.txt,并检查输出

结果是否正确。

六、测试数据

输入数据:

编辑一个文本文件program.txt,在文件中输入一段程序代码,如:

result.txt文件中,输出格式如下:

将输出结果存放在

C++源程序:

#include

#include

using namespace std;

#define MAX 5

char ch =' ';

string key[5]={"if","then","else","while","do"};

int Iskey(string c){ //关键字判断

int i;

for(i=0;i

if(key[i].compare(c)==0) return 1;

}

return 0;

}

int IsLetter(char c) { //判断是否为字母

if(((c<='z')&&(c>='a'))||((c<='Z')&&(c>='A'))) return 1;

else return 0;

}

int IsLetter1(char c) { //判断是否为a~f字母if(((c<='f')&&(c>='a'))||((c<='F')&&(c>='A'))) return 1;

else return 0;

}

int IsDigit(char c){ //判断是否为数字

if(c>='0'&&c<='9') return 1;

else return 0;

}

void scan(FILE *fpin){

string arr="";

while((ch=fgetc(fpin))!=EOF)

{

arr="";

if(ch==' '||ch=='\t'||ch=='\n'){}

else if(IsLetter(ch)||ch=='_')

{

arr=arr+ch;

ch=fgetc(fpin);

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<

else cout<

}

else if(IsDigit(ch))

{

int flag=0;

if(ch=='0')

{

arr=arr+ch;

ch=fgetc(fpin);

if(ch>='0'&&ch<='7'){

while(ch>='0'&&ch<='7')

{

flag=1;

arr=arr+ch;

ch=fgetc(fpin);

}

}

else if(ch=='x'||ch=='X')

{

flag=2;

arr=arr+ch;

ch=fgetc(fpin);

while(IsDigit(ch)||IsLetter1(ch))

{

arr=arr+ch;

ch=fgetc(fpin);

}

}

else if(ch==' '||ch==','||ch==';' ){

cout<

}

fseek(fpin,-1L,SEEK_CUR);

if(flag==1) cout<

else if(flag==2) cout<

}

else

{

相关文档
最新文档