南昌大学编译原理实验报告一

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

大学实验报告一

实验类型:□验证□综合■设计□创新实验日期:2013.4 实验成绩:

词法分析程序设计

一、实验目的

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

二、实验容

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

三、实验要求

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

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

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

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

0:标识符

1:十进制整数

2:八进制整数

3:十六进制整数

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

其中单词属性表示如下:

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

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

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

四、实验环境

PC微机

DOS操作系统或Windows 操作系统

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

五、实验步骤

编辑一个文本文件program.txt,在文件中输入如下容:

正确结果:

【实验代码】

#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

{

arr=arr+ch;

ch=fgetc(fpin);

while(IsDigit(ch))

{

arr=arr+ch;

ch=fgetc(fpin);

}

fseek(fpin,-1L,SEEK_CUR);

cout<

}

}

else switch(ch)

{

相关文档
最新文档