编译原理实验报告 - 词法分析器(内含源代码) 联系客服

发布时间 : 星期日 文章编译原理实验报告 - 词法分析器(内含源代码)更新完毕开始阅读5390567a4b73f242326c5f3a

四. 实验原理

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 \#include \#include \#include %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[]={

{\,0}, {\,1}, {\,2}, {\,3}, {\,4}, {\,5}, {\,6}, {\,7}, {\,8}, {\,9}, {\,10}, {\,11}, {\,12},

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

{\,15}, {\,16}, {\,17}, {\,18}, {\,19}, {\,20}, {\,21}, {\,22}, {\,23}, {\,24}, {\,25}, {\,26}, {\,27}, {\,28}

};

char name[20]; int kind; }KEYTABLE;

KEYTABLE keyword[]={ /*设置关键字*/ {\,0}, {\,1}, {\,2}, {\,3}, {\,4}, {\,5}, {\,6}, {\,7}, {\,8}, {\,9}, {\,10}, {\,11}, {\,12}, };

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

cout<<\<

cout<<\

词法分析器

\<

cout<<\<

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

char a,filename[10]; int n=0; gets(filename);

if((fp=fopen(filename,\))==NULL) {

printf(\); //exit(0); } else

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

a=getc(fp); /*getc函数带回一个字符,赋给a*/ set[n]=a; /*文件的每一个字符都放入set[]数组中*/ n++; }

fclose(fp); /*关闭文件*/ set[n-1]='\\0';

}

void reflesh() /*清空strtaken数组*/ {

to=0; /*全局变量to是strtaken的指示器*/ strcpy(strtaken,\); }

void pre1() /*预处理程序*/ {

int i,a,b,n=0; do {

if(set[n]=='/' && set[n+1]=='*') {

a=n; /*记录第一个注释符的位置*/ while(!(set[n]=='*' && set[n+1]=='/'))

} {

if(set[n]=='\\n')

line++; n++;

b=n+1; /*记录第二个注释符的位置*/ for(i=a;i<=b;i++) /**/

set[i]=' '; /*把注释的内容换成空格,等待第二步预处理*/ }

else if(set[n]=='/' && set[n+1]=='/')

{

a=n; /*记录第一个注释符的位置*/ while(!set[n]=='\\n') n++;

b=n+1; /*记录第二个注释符的位置*/ for(i=a;i<=b;i++) /**/

set[i]=' '; /*把注释的内容换成空格,等待第二步预处理*/ } }

void pre2() /*预处理程序*/

n++;

}while(set[n]!='\\0');