编译原理语法分析程序
河北工业大学
班级:软件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;