词法语法语义分析器代码.docx
《词法语法语义分析器代码.docx》由会员分享,可在线阅读,更多相关《词法语法语义分析器代码.docx(30页珍藏版)》请在冰豆网上搜索。
![词法语法语义分析器代码.docx](https://file1.bdocx.com/fileroot1/2022-10/9/fb19162f-08e9-4aa0-8493-fc0b80c7f025/fb19162f-08e9-4aa0-8493-fc0b80c7f0251.gif)
词法语法语义分析器代码
#include
#include
usingnamespacestd;
voidscaner();
voidcheckIDF();
voidcheckNum();
voidretract();
chargetChar();voidconcatenation();intreserve();
voidbuildlist1();
voidbuildlist2();
voiderror();
boolletter();
booldigit();
//扫A?
描0
//检[查e是否?
是?
保馈?
留?
字?
//检[查e是否?
是?
数簓字?
//回?
退?
//获?
取?
下?
一?
个?
字?
符?
//连?
接6字?
符?
//检[查e是否?
是?
保馈?
留?
字?
//建••立i?
标括?
识?
符?
表括?
II建••立i?
数簓字?
表括?
//报馈?
错洙?
II字?
母?
II数簓字?
charcharacter[80],token[8],ch,tk[4];//character数簓组哩?
保馈?
存?
输?
入?
的?
所d有瓺字
符?
token当獭?
前°要癮检[查e的?
字?
符?
intsy,syn,pt,pc,pL1=0,pL2=0,p5,p6;//syn种?
别纄编括?
码?
pttoken数簓组哩?
下?
标括?
pc
character数簓组哩?
下?
标括?
pL1标括?
志?
符?
表括?
下?
标括?
pL2数簓字?
表括?
下?
标括?
vectorlist1;//标括?
志?
符?
表括
vectorlist2;//数簓字?
表括?
voidscaner()
{
pt=0;
for(inti=0;i<8;i++)
{
token[i]=NULL;
}
chars=getChar();
while((s=='')||(s=='\n'))
{
s=getChar();
}
if(((s<='z')&&(s>='a'))||((s<='Z')&&(s>='A')))
{
checkIDF();
}
elseif((s>='0')&&(s<='9')){
syn=7;checkNum();
}
elseswitch(s){
case'=':
s=getChar();
if(s=='=')
{
sy=1;syn=14;strcpy(token,"relop");strcpy(tk,"EQ");
}
else
{syn=8;retract();token[pt]='=';
}break;
case'+':
token[pt]='+';syn=9;break;
case'*':
s=getChar();
if(s=='*')
{syn=11;strcpy(token,"**");
}
else
{
retract();
token[pt]='*';
syn=10;
}break;
case'-':
token[pt]='-';syn=12;
break;
case'/':
token[pt]='/';syn=13;
break;
case'>':
syn=14;
s=getChar();
if(s=='=')
{
sy=3;
strcpy(token,"relop");strcpy(tk,"ME");
}
else
{
sy=2;
retract();
strcpy(token,"relop");strcpy(tk,"MT");
}
break;
case'<':
syn=14;
s=getChar();
if(s=='=')
{
sy=5;
strcpy(token,"relop");strcpy(tk,"LE");
}
else
{
sy=4;
retract();
strcpy(token,"relop");strcpy(tk,"LT");
}
break;
case'!
'
s=getChar();
if
{
(s=='=')
syn=14;
strcpy(token,"relop"
strcpy(tk,"UEQ");
}
else
{retract();
coutvv"第台?
vvp5v<‘句?
"<<"第台?
vvp6v<‘个?
字?
符?
!
=";error();
}
break;
case';':
syn=15;
token[pt]=
break;
case',':
syn=16;token[pt]=',';break;
case'(':
syn=17;token[pt]='(';break;
case')':
syn=17;token[pt]=')';break;
case'&':
s=getChar();if(s=='&'){
syn=18;strcpy(token,"&&");
}else{retract();
COUtvv"第台?
vvp5v<‘句?
"<<"第台?
vvp6v<‘个?
字?
符?
&&";error();
}
break;
Case'|':
s=getChar();
if(s=='|')
{
syn=19;
strCpy(token,"||");
}
else
{
retraCt();
COUtvv"第台?
vvp5v<‘句?
"<<"第台?
vvp6v<‘个?
字?
符?
&&";error();
}
break;
defaUlt:
{
COUtvv"第台?
vvp5v<'句?
"<<"第台?
vvp6vV个?
字?
符?
不?
能U识?
别纄,"errOr();
}
}
voidcheckIDF()
{
while(letter()||digit())
{
concatenation();getChar();
}
retract();
intc=reserve();
if(c==0)
{
buildlist1();syn=6;
}
else
{
syn=c;
}
}
voidcheckNum()
{
while(digit())
{
concatenation();getChar();
}
retract();
buildlist2();
strcpy(token,"num");
}
voidretract()
{
pc--;
p6--;
}
chargetChar()
{
charcc=character[pc++];
p6++;
if(cc==';')
{
p5++;
p6=0;
}
returncc;
voidconcatenation()
{
token[pt++]=character[pc-1];
}
intreserve()
{
if(strcmp(token,"while")==0)
return1;
elseif(strcmp(token,"if")==0)
return2;
elseif(strcmp(token,"else")==0)
return3;
elseif(strcmp(token,"switch")==0)
return4;
elseif(strcmp(token,"case")==0)
return5;
else
return0;
voidbuildlist1()//建••立i?
标括?
识?
符?
表括?
{
char*c=newchar[8];strcpy(c,token);
list1.push_back(c);pL1++;
}//建••立i?
标括?
识?
符?
表括?
voidbuildlist2()//建••立i?
数簓字?
表括?
{
inti;
intn=0;
for(i=0;token[i]>='0'&&token[i]<='9';++i)
{
n=10*n+(token[i]-'0');
}
list2.push_back(n);
pL2++;
}
voiderror()
{
coutvv"岀?
现?
错洙?
误6"<}
boolletter()
{
chars=character[pc-1];
if(((s<='z')&&(s>='a'))||((s<='Z')&&(s>='A')))
{
returntrue;
else
returnfalse
}
booldigit()
{
chars=character[pc-1];
if((s>='0')&&(s<='9'))returntrue;
else
returnfalse;
}
#includeusingnamespacestd;
intlookahead;//当獭?
前°种?
别纄编括?
码?
inta1,v,p7,p8;〃a1pa数簓组哩?
下?
标括?
v=0表括?
示?
(辍?
v=1表括?
示?
)?
intpa[100][2];//第台?
一?
维?
保馈?
存?
单蹋?
词洙?
的?
种?
别纄编括?
码?
第台?
二上维?
用?
来厉?
区?
分?
种?
别纄编括?
码?
相0同?
的?
单蹋?
词洙?
intnexttoken();//下?
一?
个?
单蹋?
词洙?
的?
种?
别纄编括?
码?
voidmatch();voidS();voidA();
voidOp();voidB();
voidrelop();voidE();
voidE1();voidT();
voidT1();voidF();
voidp();
voiderror1();
intnexttoken()
{
v=pa[++a1][1];
intpaa=pa[a1][0];
p8++;
if(paa==15)
p7++;
P8"q
returnpao)1=0「
voidmaoh(inff)
宀
if(-ookaheadHU
宀
-ookaheadunex存okenp
e-se
宀
errorlpvoids()宀
if(-ookaheaduul)
宀
COUAC--S—Vwhi-e(A)s=Acendr
maoh(1「
if(ookaheadHH17QOQOVHHO)
宀
maoh(17「
Ap
e-se
宀
COUAC-Mn>7AAP7久-5r7-AA--Mn>^AA^AA-45①s®7煎欽7<4n7「errorlp
if(-00kaheadHH17QOQOVHH1)
宀
maoh(17「
sp
e-se
宀
COUAC-Mn>7A<;P7久-5r7-AA--Mn>7AAP8A
-->7也①7M
errorlp
e-seif(-00kaheadHH6=-00kaheadHH7)宀