编译原理实验报告——词法分析器(内含源代码)

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

编译原理实验(一)——词法分析器

一.实验描述

运行环境:vc++2008

对某特定语言A ,构造其词法规则。

该语言的单词符号包括:

1

2状态转换图

3程序流程:

词法分析作成一个子程序,由另一个主程序调用,每次调用返回一个单词对应的二元组,输出标识符表、常数表由主程序来完成。

二.实验目的

通过动手实践,使学生对构造编译系统的基本理论、编译程序的基本结构有更为深入的理解和掌握;使学生掌握编译程序设计的基本方法和步骤;能够设计实现编译系统的重要环节。同时增强编写和调试程序的能力。

三.实验任务

编制程序实现要求的功能,并能完成对测试样例程序的分析。

四.实验原理

char set[1000],str[500],strtaken[20];//set[]存储代码,strtaken[]存储当前字符char sign[50][10],constant[50][10];//存储标识符和常量

定义了一个Analyzer类

class Analyzer{

public:

Analyzer(); //构造函数 ~Analyzer(); //析构函数

int IsLetter(char ch); //判断是否是字母,是则返回 1,否则返回 0。

int IsDigit(char ch); //判断是否为数字,是则返回 1,否则返回 0。

void GetChar(char *ch); //将下一个输入字符读到ch中。

void GetBC(char *ch); //检查ch中的字符是否为空白,

若是,则调用GetChar直至ch进入一个非空白字符。

void Concat(char *strTaken, char *ch); //将ch中的字符连接到strToken之后。

int Reserve(char *strTaken); //对strTaken中的字符串查找保留字表,若是一个保留字返回它的数码,否则返回0。

void Retract(char *ch) ; //将搜索指针器回调一个字符位置,将ch置为空白字符。void input();//向存放输入结果的字符数组输入一句语句。

void display();//输出一些程序结束字符显示样式

int analyzerSubFun();//词法分析器子程序,为了实现词法分析的主要功能。

五.代码实现

// cifa.cpp : 定义控制台应用程序的入口点。

//

#include"stdafx.h"

#include"stdio.h"

#include"string.h"

#include"iostream"

using namespace std;

char set[1000],str[500],strtaken[20];//set[]存储代码,strtaken[]存储当前字符

char sign[50][10],constant[50][10];//存储标识符和常量

//int Words[500][10];

char ch;//当前读入字符

int sr,to=0;//数组str, strtaken 的指针

int st=0,dcount=0;

int id=0;

static int line=1;

int h,l;

typedef struct Words /*放置二元组*/

{

int num;

char letters[20];

}DS;

DS Words[500];

typedef struct words

{

char word[20];

int type;

}WORDS;

WORDS words[]={

{"program",0},

{"not",1},

{"begin",2},

{"end",3},

{"if",4},

{"then",5},

{"var",6},

{"else",7},

{"int",8},

{"while",9},

{"and",10},

{"do",11},

{"or",12},

{"+",15},

{"-",16},

{"(",17},

{")",18},

{",",19},

{";",20},

{"=",21},

{"<",22},

{">",23},

{"*",24},

{"**",25},

{">=",26},

{"<=",27},

{"!=",28}

};

typedef struct keytable /*放置关键字*/ {

char name[20];

int kind;

}KEYTABLE;

KEYTABLE keyword[]={ /*设置关键字*/

{"program",0},

{"not",1},

{"begin",2},

{"end",3},

{"if",4},

{"then",5},

{"var",6},

{"else",7},

{"int",8},

{"while",9},

{"and",10},

{"do",11},

{"or",12},

};

void openfile() /*打开文件*/

{

cout<<"____________________________________________________"<

cout<<" 词法分析器 "<

cout<<"____________________________________________________"<

cout<<"请在本程序根目录下寻找以.txt”为结尾的文件作为词法分析对象,输入文件名"<

FILE *fp;

char a,filename[10];

int n=0;

gets(filename);

if((fp=fopen(filename,"r"))==NULL)

{

printf("cannot open file.\n");

//exit(0);

}

else

while(!feof(fp)) /*文件不结束,则循环*/

{

a=getc(fp); /*getc函数带回一个字符,赋给a*/

set[n]=a; /*文件的每一个字符都放入set[]数组中*/

n++;

}

fclose(fp); /*关闭文件*/

set[n-1]='\0';

相关文档
最新文档