【网学网提醒】:网学会员为需要朋友们搜集整理了语法分析相关资料,希望对各位网友有所帮助!
#include"function.h"
boolP();//程序
boolS();//语句
boolSIF();//条件语句
boolSDE();//定义语句
boolSA();//赋值语句
boolSW();//循环语句
boolSC();//复合语句
boolB();//布尔表达式
boolb();//布尔表达式的子项
boolE();//数值表达式
boolT();//数值表达式的因式
boolF();//因式的项
voidadvance();//缓冲下一个单位
char*infile;//codetext
char*reserve;//key-word
char*id_list="";//id-list
char*constant="";//constantlist
intu=1;//rowN.O
intv=0;//i-visthecolumN.O
inti=0;//reccordcurrentcodechar
tuplech;
voidadvance(){
ch=action(infile,id_list,constant,reserve,i,u,v);
};
boolP(){//对于本程序的异常(错误)的定义——当前字不是“期望”的时候认为是错误
//异常有以下几种情况:1.“缺少”期望的字2.“多余”的字符3.“缺少”和“多余”并存
//对于“多余”,因为这种情况意味着下文有“期望”的字出现,这种情况是很复杂的,所以不讨论,
//因此本程序遇到异常时,默认是属于“缺少”。
FILE*cons=fopen(".\\constant.txt","w");
FILE*id=fopen(".\\id.txt","w");
readFile(".\\code.txt",infile);
readFile(".\\reserve.txt",reserve);
advance();
boolflag;
if(ch.type==1){advance();flag=true;}//program
else{printf("nokeyword\"program\"\n");flag=false;}
if(ch.type==33){advance();flag=flag&;true;}//processname
else{printf("nopragramname\n");flag=false;}
if(ch.type==26){advance();flag=flag&;true;}//程序名后的';'
else{printf("lackchar';'\n");flag=false;}
//进入语句集合,可为0到多个句子组成
while((ch.type!=24)&;&;(ch.type!=0)){flag=flag&;S();}
print(cons,constant,1);
fclose(cons);
print(id,id_list,1);
fclose(id);
returnflag;
}
///////////////////////////////////
boolS(){//语句
boolflag=true;
if(ch.type==9){printf("SIF\n");advance();flag=flag&;SIF();}//进入条件语句
elseif(ch.type==4){printf("SDE\n");advance();flag=flag&;SDE();}//进入定义语句
elseif(ch.type==33){printf("SA\n");advance();flag=flag&;SA();}//进入赋值语句
elseif(ch.type==12){printf("SW\n");advance();flag=flag&;SW();}//进入循环语句
elseif(ch.type==2){printf("SCbegin\n");advance();flag=flag&;SC();}//进入复合语句
elseif(ch.type==3){returntrue;}//遇到的有可能是end,如果是end不应该缓冲下一个字符,而应该让上一层的函数处理
else{returnfalse;}
returnflag;
}
boolSIF(){//条件语句
boolflag=B();
if(ch.type==10){advance();flag=flag&;S();}//then
else{printf("lackkeyword\"then\"here\n");flag=false;}
if(ch.type==11){advance();flag=flag&;S();}//else
returnflag;
}
boolSDE(){//定义
语句
boolflag;
if(ch.type==5){advance();flag=true;}//数据类型声明
else{printf("lackvartype\n");flag=false;}
if(ch.type==33){advance();}//变量名
else{printf("lackvarname\n");flag=false;}
do{
if(ch.type==23){//逗号
advance();
if(ch.type==33)advance();
else{printf("lackvarname\n");flag=false;break;}
}
elseif(ch.type!=26){printf("error\n");flag=false;break;}//不是分号时应该报错
}while(ch.type!=26);//分号结束
advance();
returnflag;
}
boolSA(){//赋值
boolflag=true;
if(ch.type==25)advance();//赋值号
else{printf("nochar':='\n");flag=false;}
flag=flag&;E();//表达式
if(ch.type==26)advance();//分号结束
else{printf("nochar';'\n");flag=false;}
returnflag;
}
boolSW(){//循环语句
boolflag=B();
if(ch.type==13){advance();flag=flag&;S();}//do
else{printf("%d,%dnokeyword\"do\"here\n",u,i-v);flag=false;}
returnflag;
}
boolSC(){//复合语句,由bigin和end围起来,中间可以有0到多个句子,
boolflag=true;
while(ch.type!=3){flag=flag&;S();}//不是end,认为复合语句未结束
advance();
returnflag;
}
///////////////////////////
boolB(){//布尔表达式
boolflag=b();
while((ch.type==6)||(ch.type==7)){advance();flag=flag&;b();}//and,or
returnflag;
}
boolb(){//布尔表达式的子项
boolflag=E();
if((ch.type>26)&;&;(ch.type<33))advance();//比较符号
else{printf("nobooloperatorhere\n");flag=false;}
flag=flag&;E();
returnflag;
}
///////////////////////////////////
boolE(){//数值表达式
boolflag=T();
while((ch.type==17)||(ch.type==18)){advance();flag=flag&;T();}//加减号
returnflag;
}
boolT(){
boolflag=F();
while((ch.type==19)||(ch.type==20)){advance();flag=flag&;F();}//乘除号
returnflag;
}
boolF(){
if((ch.type==33)||(ch.type==34)){advance();returntrue;}//数字或者变量
elseif(ch.type==21){//左括号
advance();
boolflag=E();
if(ch.type==22){advance();returntrue;}//右括号
else{printf("no')'\n");returnfalse;}
}
else{
printf("illegalchar'%d'\n",ch.type);
advance();
returnfalse;
}
}