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

时间:2025-07-11

南昌大学实验报告一

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

一、实验目的

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

二、实验内容

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

三、实验要求

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,在文件中输入一段程序代码,如:

C++源程序:

#include <iostream>

#include<string>

using namespace std;

将输出结果存放在result.txt

文件中,输出格式如下:

#define MAX 5

char ch =' ';

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

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

int i;

for(i=0;i<MAX;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); { if((ch<='Z')&&(ch>='A')) ch=ch+32; while(IsLetter(ch)||IsDigit(ch))

arr=arr+ch;

ch=fgetc(fpin);

fseek(fpin,-1L,SEEK_CUR);

if (Iskey(arr)){cout<<arr<<"\t$关键字"<<endl;}

else cout<<arr<<"\t$普通标识符"<<endl;

else

{ } 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') { } else if(ch==' '||ch==','||ch==';' ){ } fseek(fpin,-1L,SEEK_CUR); else if(flag==2) cout<<arr<<"\t$十六进制整数"<<endl; cout<<arr<<"\t$整数0"<<endl; flag=2; arr=arr+ch; while(IsDigit(ch)||IsLetter1(ch)) { } ch=fgetc(fpin); ch=fgetc(fpin); arr=arr+ch; if(flag==1) cout<<arr<<"\t$八进制整数"<<endl;

ch=fgetc(fpin); while(IsDigit(ch)) {

arr=arr+ch;

ch=fgetc(fpin);

}

fseek(fpin,-1L,SEEK_CUR);

cout<<arr<<"\t$十进制整数"<<endl;

else switch(ch)

{

case'+':

case'-' :

case'*' :

case'=' :

case'/' :cout<<ch<<"\t$运算符"<<endl;break;

case'(' :

case')' :

case'[' :

case']' :

case';' :

case'.' :

case',' :

case'{' :

case'}' :cout<<ch<<"\t$界符"<<endl;break;

case':' :{ch=fgetc(fpin);

if(ch=='=') cout<<":="<<"\t$运算符"<<endl;

else {cout<<"::"<<"\t$界符"<<endl;;

fseek(fpin,-1L,SEEK_CUR);}

}bre …… 此处隐藏:1599字,全部文档内容请下载后查看。喜欢就下载吧 ……

南昌大学编译原理实验报告-词法分析器.doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:7 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:29元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219