词法语法语义分析器代码.docx

上传人:b****1 文档编号:355845 上传时间:2022-10-09 格式:DOCX 页数:30 大小:48.98KB
下载 相关 举报
词法语法语义分析器代码.docx_第1页
第1页 / 共30页
词法语法语义分析器代码.docx_第2页
第2页 / 共30页
词法语法语义分析器代码.docx_第3页
第3页 / 共30页
词法语法语义分析器代码.docx_第4页
第4页 / 共30页
词法语法语义分析器代码.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

词法语法语义分析器代码.docx

《词法语法语义分析器代码.docx》由会员分享,可在线阅读,更多相关《词法语法语义分析器代码.docx(30页珍藏版)》请在冰豆网上搜索。

词法语法语义分析器代码.docx

词法语法语义分析器代码

#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)宀

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1