发布时间 : 星期日 文章编译原理实验报告 - 词法分析器(内含源代码)更新完毕开始阅读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');