编译原理语法分析程序

编译原理语法分析程序

河北工业大学

班级:软件121班 姓名:张汉青

注意先在执行目录下添加test.txt.

源代码:

#include

#include

#include

#include

#include

#include

#define DIGIT 1 //d

#define POINT 2 //.

#define OTHER 3 //other

#define POWER 4 //即E

#define PLUS 5 //+

#define MINUS 6 //-

#define UCON 7 //无符号数

#define EndState -1 //结束状态

int n=0,p=0,e=0,w=0; //用于计算无符号数的值 int uint=0; //保存无符号整数

double ufloat=0.0; //保存无符号实数

char KeyWord[5][6]={{"if"},{"begin"},{"end"},{"then"},{"else"}}; CString Word=""; //临时保存词法分析程序的一个单词 int row=0;//////程序记数器

bool TZ=false;///表示程序没有出错

FILE *fp;////源代码文件

FILE *fp2;///词法输出文件

//////函数原型声明

int CharToInt(char c);

int Judge(char c);

int Identify(int state,char c,FILE *fp2,CString & w); //保留字

int LookUp(char* p,char q[][6]);

CString FirstisChar(char charactor,FILE *fp,FILE* fp2);

CString Lexical(FILE* fp,FILE* fp2);

void ZC();

void E();

void T();

void F();

//////////

/////////

void main()

{

if((fp=fopen("test.txt","r"))==NULL)

{

printf("文件打开失败!");

exit(1);

}

if((fp2=fopen("result.txt","w"))==NULL)

{

printf("文件打开失败!"); exit(1); } ZC();

printf("\n处理结束!\n");

fclose(fp);

fclose(fp2);

}

//总控程序

void ZC()

{

while(Word!="EOF")

{

E();

if(Word!="EOF")

{

if(Word!="#" || TZ==true)//出错

{

row++;//程序计数器加1

printf("\n");

printf("第%d句有错误!\n",row);

while(Word!="#")

{

} } else { if(Word=="EOF") { return; } else { Word=Lexical(fp,fp2); } row++;//程序计数器加1 printf("\n");

printf("第%d句正确!\n",row);

}

}

else

{

return;

}

}

}

////E产生式

void E()

{

T();

if(Word=="PL"||Word=="MI")

{

T();

}

else

{

return;

}

}

////T产生式

void T()

{

F();

if(Word=="MU"||Word=="DI")

{

T();

}

else

{

return;

}

}

//F产生式

void F()

{

Word=Lexical(fp,fp2);//调用词法分析程序

if(Word=="ID" || Word=="FCON" || Word=="ICON") {

Word=Lexical(fp,fp2);

return;

}

else if(Word=="LB")

{

E();

if(Word=="RB")

{

Word=Lexical(fp,fp2);

return;

}

else

{

TZ=true;//报错 return; } } else { TZ=1;//报错 return; }

/////词法分析程序

CString Lexical(FILE* fp,FILE* fp2)

{

char charactor;

CString w="";

while( (charactor=fgetc(fp))!=EOF )

{

/////第一个字符是单词 if( (charactor>='a') && (charactor='0') &&(charactor

} charactor=fgetc(fp); if(charactor=='=') { w="LE"; fprintf(fp2,"(LE, )"); } else if(charactor=='>') { w="NE"; fprintf(fp2,"(NE, )"); } else { w="LT"; fprintf(fp2,"(LT, )"); } //////////// else if( charactor=='=' ) { w="EQ"; fprintf(fp2,"(EQ,)"); } //////// else if( charactor=='>' ) { charactor=fgetc(fp); if( charactor=='=' ) { w="GE"; fprintf(fp2,"(GE, )"); } else { w="GT"; fprintf(fp2,"(GT, )"); } }

///////// else if( charactor==':') { charactor=fgetc(fp); ////////////printf("执行了!"); } if( charactor == '=' ) { w="IS"; fprintf(fp2,"(IS, )"); } else { w=""; } //////// else if( charactor=='+' ) { w="PL"; fprintf(fp2,"(PL, )"); } ////// else if( charactor=='-' ) { w="MI"; fprintf(fp2,"(MI, )"); } else if( charactor=='*' ) { w="MU"; fprintf(fp2,"(MU, )"); } else if( charactor=='/' )

{

w="DI";

fprintf(fp2,"(DI, )");

}

else if( charactor==' ')

{

continue;

}

else if(charactor=='\t' ||

{

continue;

}

else if(charactor=='(')

{

w="LB";

fprintf(fp2,"((, )");

}

else if(charactor==')')

{

w="RB";

fprintf(fp2,"((, ))");

}

else if(charactor==';')

{

w="#";

fprintf(fp2,"#");

}

else

{

w="";

break;

}

return w;

}

if(charactor==EOF)

{

w="EOF";

return w; charactor=='\r' ||charactor=='\n')

}

return w;

}

////

///词法分析程序中的,第一个字符是字母

CString FirstisChar(char charactor,FILE* fp,FILE* fp2)

{

//if( (charactor>='a') && (charactor

char Token[32];

int i=0;

Token[i]=charactor;

/////////////////////////

//putchar(charactor);

//printf("\n");

while( (charactor=fgetc(fp))!=EOF )

{

if( ( (charactor>='a') && (charactor

{

i++;

Token[i]=charactor;

/////////////////////////

//putchar(charactor);

//printf("\n");

}

else

{

int tag=0;//标志,0表示标示符,非零表示保留字 fseek(fp,-1,1);//指针回溯

i++;

Token[i]='\0';//字符串结束标志

tag=LookUp(Token,KeyWord);//输出对应的保留字 switch(tag)

{

case 0: ( (charactor>='1') &&

}

/* } } fprintf(fp2,"(ID,%s)",Token); return "ID"; case 1: fprintf(fp2,"(IF, )"); return "IF"; case 2: fprintf(fp2,"(BEGIN, )"); return "BEFIN"; case 3: fprintf(fp2,"(END, )"); return "END"; case 4: fprintf(fp2,"(THEN, )"); return "THEN"; case 5: fprintf(fp2,"(ELSE, )"); return "ELSE"; } break;

字符型转换成整型

形参为字符型

返回值为整型

*/

int CharToInt(char c)

{

return c-48;

}

/*

判断输入字符的类型

形参位字符型表示需要判断的字符 返回值为整型表示该字符的类型 */

int Judge(char c)

{

int symbol;

if(c>='0'&&c

symbol=DIGIT;

}

/* else if(c=='.') { symbol=POINT; } else if(c=='E') { symbol=POWER; } else if(c=='-') { symbol=MINUS; } else if(c=='+') { } //为. //为E /////printf("执行+++++++++\n"); symbol=PLUS; /////////////printf("symbol=?%d\n",symbol); //其他 else { symbol=OTHER; } return symbol;

识别过程

形参为整型表示当前状态和字符型表示扫视字符

返回值为整型表示后继状态

*/

int Identify(int state,char c,FILE*fp2,CString & word)

{

int symbol;

symbol=Judge(c);//判断字符的类型(数字、点、E、+、-或其他) switch(state)

{

case 0:

switch(symbol)

{

case DIGIT:

n=0;p=0;e=1;w=CharToInt(c);

break; case POINT: w=0;n=0;p=0;e=1; state=3; break; default: state=EndState; word=""; break; } break; case 1: switch(symbol) { case DIGIT: w=w*10+CharToInt(c); state=1; break; case POINT: state=2; break; case POWER: state=4; break; default: uint=w; fprintf(fp2,"(ICON,%d)",uint); word="ICON"; state=EndState; break; } break; case 2: switch(symbol) { case DIGIT: n++;w=w*10+CharToInt(c); state=2; break; case POWER: state=4;

default: ufloat=w*pow(10,e*p-n); fprintf(fp2,"(FCON,%lf)",ufloat); state=EndState; word="FCON"; break; } break; case 3: switch(symbol) { case DIGIT: n++;w=w*10+CharToInt(c); state=2; break; default: state=EndState; word=""; break; } break; case 4: switch(symbol) { case DIGIT: p=p*10+CharToInt(c); state=6; break; case MINUS: e=-1; state=5; break; case PLUS: state=5; break; default: state=EndState; word=""; break; } break;

switch(symbol) { case DIGIT:

////////////printf("执行状态5\n"); p=p*10+CharToInt(c);

state=6;

break;

default:

state=EndState;

word="";

break;

}

break;

case 6:

switch(symbol)

{

case DIGIT:

p=p*10+CharToInt(c);

state=6;

break;

default:

///////////////printf("执行状态6\n"); ufloat=w*pow(10,e*p-n);

fprintf(fp2,"(FCON,%lf)",ufloat);

state=EndState;

word="FCON";

break;

}

break;

}

return state;

}

int LookUp(char* p,char q[][6])

{

int tag=0;//标志,为0表示标示符,非零表示保留字 for(int i=0;i

{

} { tag=i+1; break; } } return tag;

编译原理语法分析程序

河北工业大学

班级:软件121班 姓名:张汉青

注意先在执行目录下添加test.txt.

源代码:

#include

#include

#include

#include

#include

#include

#define DIGIT 1 //d

#define POINT 2 //.

#define OTHER 3 //other

#define POWER 4 //即E

#define PLUS 5 //+

#define MINUS 6 //-

#define UCON 7 //无符号数

#define EndState -1 //结束状态

int n=0,p=0,e=0,w=0; //用于计算无符号数的值 int uint=0; //保存无符号整数

double ufloat=0.0; //保存无符号实数

char KeyWord[5][6]={{"if"},{"begin"},{"end"},{"then"},{"else"}}; CString Word=""; //临时保存词法分析程序的一个单词 int row=0;//////程序记数器

bool TZ=false;///表示程序没有出错

FILE *fp;////源代码文件

FILE *fp2;///词法输出文件

//////函数原型声明

int CharToInt(char c);

int Judge(char c);

int Identify(int state,char c,FILE *fp2,CString & w); //保留字

int LookUp(char* p,char q[][6]);

CString FirstisChar(char charactor,FILE *fp,FILE* fp2);

CString Lexical(FILE* fp,FILE* fp2);

void ZC();

void E();

void T();

void F();

//////////

/////////

void main()

{

if((fp=fopen("test.txt","r"))==NULL)

{

printf("文件打开失败!");

exit(1);

}

if((fp2=fopen("result.txt","w"))==NULL)

{

printf("文件打开失败!"); exit(1); } ZC();

printf("\n处理结束!\n");

fclose(fp);

fclose(fp2);

}

//总控程序

void ZC()

{

while(Word!="EOF")

{

E();

if(Word!="EOF")

{

if(Word!="#" || TZ==true)//出错

{

row++;//程序计数器加1

printf("\n");

printf("第%d句有错误!\n",row);

while(Word!="#")

{

} } else { if(Word=="EOF") { return; } else { Word=Lexical(fp,fp2); } row++;//程序计数器加1 printf("\n");

printf("第%d句正确!\n",row);

}

}

else

{

return;

}

}

}

////E产生式

void E()

{

T();

if(Word=="PL"||Word=="MI")

{

T();

}

else

{

return;

}

}

////T产生式

void T()

{

F();

if(Word=="MU"||Word=="DI")

{

T();

}

else

{

return;

}

}

//F产生式

void F()

{

Word=Lexical(fp,fp2);//调用词法分析程序

if(Word=="ID" || Word=="FCON" || Word=="ICON") {

Word=Lexical(fp,fp2);

return;

}

else if(Word=="LB")

{

E();

if(Word=="RB")

{

Word=Lexical(fp,fp2);

return;

}

else

{

TZ=true;//报错 return; } } else { TZ=1;//报错 return; }

/////词法分析程序

CString Lexical(FILE* fp,FILE* fp2)

{

char charactor;

CString w="";

while( (charactor=fgetc(fp))!=EOF )

{

/////第一个字符是单词 if( (charactor>='a') && (charactor='0') &&(charactor

} charactor=fgetc(fp); if(charactor=='=') { w="LE"; fprintf(fp2,"(LE, )"); } else if(charactor=='>') { w="NE"; fprintf(fp2,"(NE, )"); } else { w="LT"; fprintf(fp2,"(LT, )"); } //////////// else if( charactor=='=' ) { w="EQ"; fprintf(fp2,"(EQ,)"); } //////// else if( charactor=='>' ) { charactor=fgetc(fp); if( charactor=='=' ) { w="GE"; fprintf(fp2,"(GE, )"); } else { w="GT"; fprintf(fp2,"(GT, )"); } }

///////// else if( charactor==':') { charactor=fgetc(fp); ////////////printf("执行了!"); } if( charactor == '=' ) { w="IS"; fprintf(fp2,"(IS, )"); } else { w=""; } //////// else if( charactor=='+' ) { w="PL"; fprintf(fp2,"(PL, )"); } ////// else if( charactor=='-' ) { w="MI"; fprintf(fp2,"(MI, )"); } else if( charactor=='*' ) { w="MU"; fprintf(fp2,"(MU, )"); } else if( charactor=='/' )

{

w="DI";

fprintf(fp2,"(DI, )");

}

else if( charactor==' ')

{

continue;

}

else if(charactor=='\t' ||

{

continue;

}

else if(charactor=='(')

{

w="LB";

fprintf(fp2,"((, )");

}

else if(charactor==')')

{

w="RB";

fprintf(fp2,"((, ))");

}

else if(charactor==';')

{

w="#";

fprintf(fp2,"#");

}

else

{

w="";

break;

}

return w;

}

if(charactor==EOF)

{

w="EOF";

return w; charactor=='\r' ||charactor=='\n')

}

return w;

}

////

///词法分析程序中的,第一个字符是字母

CString FirstisChar(char charactor,FILE* fp,FILE* fp2)

{

//if( (charactor>='a') && (charactor

char Token[32];

int i=0;

Token[i]=charactor;

/////////////////////////

//putchar(charactor);

//printf("\n");

while( (charactor=fgetc(fp))!=EOF )

{

if( ( (charactor>='a') && (charactor

{

i++;

Token[i]=charactor;

/////////////////////////

//putchar(charactor);

//printf("\n");

}

else

{

int tag=0;//标志,0表示标示符,非零表示保留字 fseek(fp,-1,1);//指针回溯

i++;

Token[i]='\0';//字符串结束标志

tag=LookUp(Token,KeyWord);//输出对应的保留字 switch(tag)

{

case 0: ( (charactor>='1') &&

}

/* } } fprintf(fp2,"(ID,%s)",Token); return "ID"; case 1: fprintf(fp2,"(IF, )"); return "IF"; case 2: fprintf(fp2,"(BEGIN, )"); return "BEFIN"; case 3: fprintf(fp2,"(END, )"); return "END"; case 4: fprintf(fp2,"(THEN, )"); return "THEN"; case 5: fprintf(fp2,"(ELSE, )"); return "ELSE"; } break;

字符型转换成整型

形参为字符型

返回值为整型

*/

int CharToInt(char c)

{

return c-48;

}

/*

判断输入字符的类型

形参位字符型表示需要判断的字符 返回值为整型表示该字符的类型 */

int Judge(char c)

{

int symbol;

if(c>='0'&&c

symbol=DIGIT;

}

/* else if(c=='.') { symbol=POINT; } else if(c=='E') { symbol=POWER; } else if(c=='-') { symbol=MINUS; } else if(c=='+') { } //为. //为E /////printf("执行+++++++++\n"); symbol=PLUS; /////////////printf("symbol=?%d\n",symbol); //其他 else { symbol=OTHER; } return symbol;

识别过程

形参为整型表示当前状态和字符型表示扫视字符

返回值为整型表示后继状态

*/

int Identify(int state,char c,FILE*fp2,CString & word)

{

int symbol;

symbol=Judge(c);//判断字符的类型(数字、点、E、+、-或其他) switch(state)

{

case 0:

switch(symbol)

{

case DIGIT:

n=0;p=0;e=1;w=CharToInt(c);

break; case POINT: w=0;n=0;p=0;e=1; state=3; break; default: state=EndState; word=""; break; } break; case 1: switch(symbol) { case DIGIT: w=w*10+CharToInt(c); state=1; break; case POINT: state=2; break; case POWER: state=4; break; default: uint=w; fprintf(fp2,"(ICON,%d)",uint); word="ICON"; state=EndState; break; } break; case 2: switch(symbol) { case DIGIT: n++;w=w*10+CharToInt(c); state=2; break; case POWER: state=4;

default: ufloat=w*pow(10,e*p-n); fprintf(fp2,"(FCON,%lf)",ufloat); state=EndState; word="FCON"; break; } break; case 3: switch(symbol) { case DIGIT: n++;w=w*10+CharToInt(c); state=2; break; default: state=EndState; word=""; break; } break; case 4: switch(symbol) { case DIGIT: p=p*10+CharToInt(c); state=6; break; case MINUS: e=-1; state=5; break; case PLUS: state=5; break; default: state=EndState; word=""; break; } break;

switch(symbol) { case DIGIT:

////////////printf("执行状态5\n"); p=p*10+CharToInt(c);

state=6;

break;

default:

state=EndState;

word="";

break;

}

break;

case 6:

switch(symbol)

{

case DIGIT:

p=p*10+CharToInt(c);

state=6;

break;

default:

///////////////printf("执行状态6\n"); ufloat=w*pow(10,e*p-n);

fprintf(fp2,"(FCON,%lf)",ufloat);

state=EndState;

word="FCON";

break;

}

break;

}

return state;

}

int LookUp(char* p,char q[][6])

{

int tag=0;//标志,为0表示标示符,非零表示保留字 for(int i=0;i

{

} { tag=i+1; break; } } return tag;


相关内容

  • 编译原理--教学大纲
  • <计算机编译原理>课程大纲 一.适用对象 本课程适用于计算机科学与技术以及相关专业的网络教育.成人教育学生. 二.课程性质 本课程是计算机科学与技术专业学生的专业基础课. 编译原理课程是计算机专业的一门主干课程.课程介绍程序设计语言编译程序构造的一般原理.基本设计方法.主要实现技术和一些 ...

  • 张瑞编译原理实验报告
  • 黑龙江大学 "编译原理课程设计"读书报告 学院 年级 专业 学号 姓名 报告日期 成绩 软件学院 2012级 软件工程 20122515 张瑞 2014年6月28日 黑龙江大学计算机科学技术学院 黑龙江大学软件学院 概述 "编译原理"课程是计算机专业中一门重要 ...

  • 编译原理论文
  • 编译原理心得体会 编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法,在计算机本科教学中占有十分重要的地位. 该课程理论性与实践性都很强,我们在学习 是普遍感到内容非常抽象,不易理解,内容多且繁琐,难以完整.全面地掌握编译原理的有关知识,更不用说灵活运用编译原理知识从事相 ...

  • 编译原理名词解释
  • .名词解释: 1)前缀 答:前缀--是指符号串任意首部. 2)可归前缀 答:可归前缀--是指规范句型的一个前缀,这种前缀包含句柄且不含句柄之后的任何符号. 3)活前缀 答:活前缀--规范句型的一个前缀,这种前缀不含句柄之后的任何符号. 或给定文法规范句型的可归前缀的任意首部. 4)简单短语 答:简单 ...

  • 编译原理(选择.填空.简答)题
  • 一.是非题(下列各题,你认为正确的,请在题干的括号内打"√",错的打"×".每题1分, 共5分) 1.算符优先关系表不一定存在对应的优先函数. √ 2.数组元素的地址计算与数组的存储方式有关.√ 3.仅考虑一个基本块,不能确定一个赋值是否真是无用的.√ 4.每 ...

  • 编译原理教程课后习题答案--第八章
  • 第八章 符号表与错误处理 8.1 完成下列选择题: (1) 编译程序使用区别标识符的作用域. a. 说明标识符的过程或函数名 b. 说明标识符的过程或函数的静态层次 c. 说明标识符的过程或函数的动态层次 d. 标识符的行号 (2) 在目标代码生成阶段,符号表用于. a. 目标代码生成 b. 语义检 ...

  • 编译原理试题1
  • 课程测试试题(A卷) 一.填空 (30分) 1.将编译过程的各阶段划分为前端或后端和将编译程序分遍的主要参考因素都是( )和( )的特征. 2.( )是一种语法分析程序的自动构造工具,用它可以直接构造各种语言的语法分析器:而( )是一种词法分析程序的自动构造工具,用它可以直接构造各种语言的词法分析器 ...

  • 合肥工业大学编译原理课程设计
  • 关于<编译原理>课程设计的有关说明 <编译原理>是计算机专业的一门重要的专业课程,其中包含大量软件设计思想.大家通过课程设计,实现一些重要的算法,或设计一个完整的编译程序模型,能够进一步加深理解和掌握所学知识,对提高自己的软件设计水平具有十分重要的意义.大家在进行课程设计时, ...

  • 编译原理实验指导书(2015)
  • LIAOCHENG UNIVERSITY 编译原理 实验指导书 聊城大学计算机学院 2011年3月 目 录 <编译原理>课程实验教学大纲 ............................. 1 实验一 词法分析器的设计 .............................. ...

  • [编译原理]实验教学大纲
  • <编译原理>课程实验教学大纲 1.实验课程号: 20013B3sy 2.课程属性:必修 3.实验属性:非独立设课 4.学时学分: 12学时 5.实验应开学期:秋季 6.先修课程:C 语言FORTRAN 语言或PASCAL 语言,汇编语言,数据结构,离散数学等. 一.课程的性质与任务 本课 ...