亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? cifa.c

?? c語言寫的pascal詞法語法分析器
?? C
?? 第 1 頁 / 共 2 頁
字號:

void statement(struct node *fsys,int plev)
{//語句處理
int i,cx1,cx2,m=0,n=0;
char *tempset1[]={"rparen","comma",NULL};
char *tempset2[]={"thensym","dosym",NULL};
char *tempset3[]={"semicolon","endsym",NULL};
char *tempset4[]={"semicolon",NULL};
char *tempset5[]={"dosym",NULL};
char *tempset6[]={NULL};

struct node *temp1,*temp2,*temp3,*temp4,*temp5,*temp6;
temp1=(struct node *)malloc(sizeof(struct node));
temp2=(struct node *)malloc(sizeof(struct node));
temp3=(struct node *)malloc(sizeof(struct node));
temp4=(struct node *)malloc(sizeof(struct node));
temp5=(struct node *)malloc(sizeof(struct node));
temp6=(struct node *)malloc(sizeof(struct node));

while(tempset1[m]!=NULL)
{
temp1->pa[n++]=tempset1[m++];
}
temp1->pa[n]=NULL;
m=0;n=0;
while(tempset2[m]!=NULL)
{
temp2->pa[n++]=tempset2[m++];
}
temp2->pa[n]=NULL;
m=0;n=0;
while(tempset3[m]!=NULL)
{
temp3->pa[n++]=tempset3[m++];
}
temp3->pa[n]=NULL;
m=0;n=0;
while(tempset4[m]!=NULL)
{
temp4->pa[n++]=tempset4[m++];
}
temp4->pa[n]=NULL;
m=0;n=0;
while(tempset5[m]!=NULL)
{
temp5->pa[n++]=tempset5[m++];
}
temp5->pa[n]=NULL;
m=0;n=0;
while(tempset6[m]!=NULL)
{
temp6->pa[n++]=tempset6[m++];
}
temp6->pa[n]=NULL;

m=0;n=0;
if(strcmp(sym,"ident")==0)
{
i=position(id);
if(i==0)
{
error(11);
}
else
{
if(table[i].kind!=variable)//賦值號左部標識符的屬性不是變量
{
error(12);
i=0;
}
}
getsym();
if(strcmp(sym,"becomes")==0)
{
getsym();
}
else //賦值號左部標識符的后繼符號不是':='
{
error(13);
}
expression(fsys);
if(i!=0)
{
gen(sto,plev-table[i].level,table[i].adr);
}
}
else if(strcmp(sym,"readsym")==0)
{
getsym();
if(strcmp(sym,"lparen")!=0)
{
error(24);
}
else
{
do
{
getsym();
if(strcmp(sym,"ident")==0)
{
i=position(id);
}
else
{
i=0;
}
if(i==0)
{
error(35);
}
else
{
gen(opr,0,16);
gen(sto,plev-table[i].level,table[i].adr);
}
getsym();
}
while(strcmp(sym,"comma")==0);
}
if(strcmp(sym,"rparen")!=0)
{
error(22);
while(in(sym,fsys)==0)
{
getsym();
}
}
else 
{
getsym();
}
}
else if(strcmp(sym,"writesym")==0)
{
getsym();
if(strcmp(sym,"lparen")==0)
{
do
{
getsym();
expression(add(temp1,fsys));
gen(opr,0,14);
}
while(strcmp(sym,"comma")==0);

if(strcmp(sym,"rparen")!=0)
{
error(33);
}
else
{
getsym();
}
}
gen(opr,0,15);
}
else if(strcmp(sym,"callsym")==0)
{
getsym();
if(strcmp(sym,"ident")!=0)
{
error(14);
}
else
{
i=position(id);
if(i==0) 
{
error(11);
}
else
{
if(table[i].kind==procedur)
{
gen(cal,plev-table[i].level,table[i].adr);
}
else
{
error(15);
}
}
getsym();
}
}
else if(strcmp(sym,"ifsym")==0)
{
getsym();
condition(add(temp2,fsys));
if(strcmp(sym,"thensym")==0)getsym();
else error(16);
cx1=cx;
gen(jpc,0,0);
statement(fsys,plev);
code[cx1].a=cx;
}
else if(strcmp(sym,"beginsym")==0)
{
getsym();
statement(add(temp3,fsys),plev);
while(in(sym,add(temp4,statbegsys))==1)
{
if(strcmp(sym,"semicolon")==0)
{
getsym();
}
else
{
error(10);
}
statement(add(temp3,fsys),plev);
}
if(strcmp(sym,"endsym")==0)
{
getsym();
}
else
{
error(17);
}
}
else
{
if(strcmp(sym,"whilesym")==0)
{
cx1=cx;
getsym();
condition(add(temp5,fsys));
cx2=cx;
gen(jpc,0,0);
if(strcmp(sym,"dosym")==0)
{
getsym();
}
else
{
error(18);
}
statement(fsys,plev);
gen(jmp,0,cx1);
code[cx2].a=cx;
}
}
test(fsys,temp6,19);
}

//語法分析
void block(int plev,struct node *fsys)
{
int m=0,n=0;
int dx=3;
int tx0;//起始標識符的小標
static int cx0=0;//起始代碼下標
char *tempset1[]={"semicolon","endsym",NULL};
char *tempset2[]={"ident","procsym",NULL};
char *tempset3[]={"semicolon",NULL};
char *tempset4[]={"ident",NULL};
char *tempset5[]={NULL};

struct node *temp1,*temp2,*temp3,*temp4,*temp5;
temp1=(struct node *)malloc(sizeof(struct node ));
temp2=(struct node *)malloc(sizeof(struct node ));
temp3=(struct node *)malloc(sizeof(struct node ));
temp4=(struct node *)malloc(sizeof(struct node ));
temp5=(struct node *)malloc(sizeof(struct node ));
while(tempset1[m]!=NULL)
{
temp1->pa[n++]=tempset1[m++];
}
temp1->pa[n]=NULL;
m=0;n=0;
while(tempset2[m]!=NULL)
{
temp2->pa[n++]=tempset2[m++];
}
temp2->pa[n]=NULL;
m=0;n=0;
while(tempset3[m]!=NULL)
{
temp3->pa[n++]=tempset3[m++];
}
temp3->pa[n]=NULL;
m=0;n=0;
while(tempset4[m]!=NULL)
{
temp4->pa[n++]=tempset4[m++];
}
temp4->pa[n]=NULL;
m=0;n=0;
while(tempset5[m]!=NULL)
{
temp5->pa[n++]=tempset5[m++];
}
temp5->pa[n]=NULL;
m=0;n=0;
lev=plev;
dx=3;
tx0=tx;
table[tx].adr=cx;
gen(jmp,0,1);
if(plev>LEVMAX)
{
error(32);
}
do
{
if(strcmp(sym,"constsym")==0)
{
getsym();
do
{
constdeclaration();
while(strcmp(sym,"comma")==0)
{
getsym();
constdeclaration();
}
if(strcmp(sym,"semicolon")==0)
{
getsym();
}
else
{
error(5);
}
}
while(strcmp(sym,"ident")==0);
}
if(strcmp(sym,"varsym")==0)
{
getsym();
do
{
vardeclaration();
while(strcmp(sym,"comma")==0)
{
getsym();
vardeclaration();
}
if(strcmp(sym,"semicolon")==0)
{
getsym();
}
else
{
error(5);
}
}
while(strcmp(sym,"ident")==0);
}
while(strcmp(sym,"procsym")==0)
{
getsym();
if(strcmp(sym,"ident")==0)
{
enter(procedur);
getsym();
}
else error(4);
if(strcmp(sym,"semicolon")==0)
{
getsym();
}
else
{
error(5);
}
block(plev+1,add(temp3,fsys));
lev=lev-1;
if(strcmp(sym,"semicolon")==0)
{
getsym();
test(add(statbegsys,temp2),fsys,6);
}
else
{
error(5);
}
}
test(add(statbegsys,temp4),declbegsys,7);
}
while(in(sym,declbegsys)==1);

code[table[tx0].adr].a=cx;
table[tx0].adr=cx;
table[tx0].size=dx; 
gen(ini,0,dx);
statement(add(temp1,fsys),plev);
gen(opr,0,0);
test(fsys,temp5,8);
listcode(&cx0); 
cx0=cx;
}


//返回基地址,提供計算靜態鏈表信息
int base(int l,int *b,int s[STACKSIZE])
{
int b1;
b1=*b;
//順靜態鏈求層差為L的層的基地址
while(l>0)
{
b1=s[b1];
l=l-1;
}
return b1;
}

//解釋執行
void interpret()
{
int p=0;
int b=1;
int t=0;
struct instruction i;
int s[STACKSIZE];
printf("開始執行 PL0……\n\n");
s[0]=0;
s[1]=0;
s[2]=0;
s[3]=0;
do
{
i=code[p];
p=p+1;
switch(i.f)
{
case lit://入棧
t=t+1;
s[t]=i.a;
break;
case opr:
switch(i.a)
{
case 0://跳轉控制
t=b-1;
p=s[t+3];
b=s[t+2];
break;
case 1://取反
s[t]=-s[t];
break;
case 2://加法
t=t-1;
s[t]=s[t]+s[t+1];
break;
case 3://減法
t=t-1;
s[t]=s[t]-s[t+1];
break;
case 4://乘法
t=t-1;
s[t]=s[t]*s[t+1];
break;
case 5://除法
t=t-1;
s[t]=s[t]/s[t+1];
break;
case 6://奇偶判斷
if(s[t]%2==0)
{
s[t]=0;
}
else 
{
s[t]=1;
}
break;
case 8://關系運算符==
t=t-1;
if(s[t]==s[t+1])
{
s[t]=1;
}
else
{
s[t]=0;
}
break;
case 9://關系運算符!=
t=t-1;
if(s[t]==s[t+1]) 
{
s[t]=0;
}
else 
{
s[t]=1;
}
break;
case 10://關系運算符<
t=t-1;
if(s[t]<s[t+1]) 
{
s[t]=1;
}
else 
{
s[t]=0;
}
break;
case 11://關系運算符>=
t=t-1;
if(s[t]>=s[t+1]) 
{
s[t]=1;
}
else 
{
s[t]=0;
}
break;
case 12://關系運算符>
t=t-1;
if(s[t]>s[t+1]) 
{
s[t]=1;
}
else 
{
s[t]=0;
}
break;
case 13://關系運算符<=
t=t-1;
if(s[t]<=s[t+1])
{ 
s[t]=1;
}
else
{ 
s[t]=0;
}
break;
case 14://write 
printf("Result: %d\n",s[t]);
fprintf(fa2,"Result: %d\n",s[t]);
t=t-1;
break;
case 15://換行
//printf("\n");
//fprintf(fa2,"\n");
break;
case 16://read
t=t+1;
printf("請輸入源程序所需的整數:\n");
fprintf(fa2,"執行程序所用的整數為:\t");
//scanf("%d",&s[t]);
//cin>>s[t];
char mychar;
cin>>mychar;
while(!isdigit(mychar))
{
cout<<"非數字,請重新輸入:"<<endl;
cin>>mychar;
} 
s[t]=mychar-48;

cout<<endl;
fprintf(fa2,"%d\n\n",s[t]);
break;
}
break;
case lod://取變量(相對地址為a,層次差為l)放到數據棧的棧頂
t=t+1;
s[t]=s[base(i.l,&b,s)+i.a];
break;
case sto://將數據棧棧頂的內容存人變量
s[base(i.l,&b,s)+i.a]=s[t];
t=t-1;
break;
case cal://調用過程(入口地址為a,層次差為l)
s[t+1]=base(i.l,&b,s);
s[t+2]=b;
s[t+3]=p;
b=t+1;
p=i.a;
break;
case ini://數據棧棧頂指針增加a
t=t+i.a;
break;
case jmp://無條件轉移到地址為a的指令
p=i.a;
break;
case jpc://條件轉移到地址為a的指令
if(s[t]==0)
{
p=i.a;
}
t=t-1;
break;
}
}
while(p!=0);
cout<<endl<<"PL0 執行結束!"<<endl<<endl;

fclose(fa2);
}


void main()
{
int m=0,n=0;
char *declbeg[]={"constsym","varsym","procsym",NULL};
char *statbeg[]={"beginsym","callsym","ifsym","whilesym",NULL};
char *facbeg[]={"ident","number","lparen",NULL};
char *tempset[]={"period","constsym","varsym","procsym",NULL};
declbegsys=(struct node *)malloc(sizeof(struct node));
statbegsys=(struct node *)malloc(sizeof(struct node));
facbegsys=(struct node *)malloc(sizeof(struct node));
tempsetsys=(struct node *)malloc(sizeof(struct node));
while(declbeg[m]!=NULL)
{
declbegsys->pa[n++]=declbeg[m++];
}
declbegsys->pa[n]=NULL;
m=0;
n=0;
while(statbeg[m]!=NULL)
{
statbegsys->pa[n++]=statbeg[m++];
}
statbegsys->pa[n]=NULL;
m=0;n=0;
while(facbeg[m]!=NULL)
{
facbegsys->pa[n++]=facbeg[m++];
}
facbegsys->pa[n]=NULL;
m=0;n=0;
while(tempset[m]!=NULL)
{
tempsetsys->pa[n++]=tempset[m++];
}
tempsetsys->pa[n]=NULL;

if((fa1=fopen("Analyse.txt","w"))==NULL)
{
printf("程序不能打開存放分析過程信息的文件(“Analyse.txt”)!\n");
exit(0);
}

//打開PASCAL源文件
printf("請輸入要編譯的PASCAL源程序所在文件名:\n");
scanf("%s",fname); 
while((fin=fopen(fname,"r"))==NULL)
{
printf("打開該文件失敗!\n是否重試?(Y/N)\n");
char mychar;
cin>>mychar;
if(mychar=='Y'||mychar=='y')
{
system("cls");//清屏
printf("請輸入要編譯的PASCAL源程序所在文件名:\n");
scanf("%s",fname);
}
else
{
exit(0);
}
}
fprintf(fa1,"對PASCAL源程序的分析為: \n(源程序來自:%s)\n\n",fname);
printf("是否列出偽代碼?(Y/N)\n");
scanf("%s",fname);
if(fname[0]=='y'||fname[0]=='Y')
{
listswitch=tru;
printf("\n偽代碼如下:\n\n");
}
else
{
listswitch=fals;
printf("\n源程序如下:\n\n");
}
err=0;
cc=1; 
cx=0; 
ll=0;
ch=' '; 
kk=AL;

getsym();
if((fa=fopen("ObjectCode.txt","w"))==NULL)
{
printf("打開存放偽代碼文件(“ObjectCode.txt”)失敗!\n");
exit(0);
}
else
{
fprintf(fa,"偽代碼如下:\n\n");
}
if((fa2=fopen("Result.txt","w"))==NULL)
{
printf("打開程序執行結果文件(“Result.txt”)失敗!\n");
exit(0);
}

block(0,add(statbegsys,tempsetsys));
fclose(fa); 
if(strcmp(sym,"period")!=0)
{
error(9);
}
if(err==0)
{
fprintf(fa1,"\n\n在該程序中未發現語法錯誤!\n");
interpret(); 
}
else
{
printf("\n\n%d 個錯誤在該PASCAL源程序中!\n請修改并重新編譯!\n\n",err);
}
fclose(fa1);
fclose(fin); 
}

例子:Top

1、輸入文件(*.txt):

var b,c,d;
begin
b:=10;
d:=10;
read(c);
read(d);
b:=c;
b:=c+d;
write(b)
end.

2、輸出文件(ObjectCode.txt):

偽代碼如下:

0 jmp 0 1
1 ini 0 3
2 lit 0 10
3 sto 0 0
4 lit 0 10
5 sto 0 2
6 opr 0 16
7 sto 0 1
8 opr 0 16
9 sto 0 2
10 lod 0 1
11 sto 0 0
12 lod 0 1
13 lod 0 2
14 opr 0 2
15 sto 0 0
16 lod 0 0
17 opr 0 14
18 opr 0 15
19 opr 0 0

3、輸入:

該段pascal程序需要有兩個輸入:

隨意輸入:0到9的一個數,如果一次輸入2位數會被認為是一次輸入兩個數。

會輸出兩個輸入數的和。


 
   
  

--------------------------------------------------------------------------------

Top

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲v日本v欧美v久久精品| 波多野结衣亚洲一区| 国产精品影视在线观看| 色综合网站在线| 精品国产第一区二区三区观看体验| 亚洲成人激情自拍| 国产成人在线视频播放| 欧美裸体一区二区三区| 亚洲免费在线视频| 国产69精品久久久久毛片| 国产日韩av一区| 麻豆国产精品视频| 欧美精品高清视频| 一区二区三区在线观看视频 | 国产毛片精品视频| 欧美精品一级二级| 一区2区3区在线看| av电影天堂一区二区在线观看| 国产精品自拍三区| 日韩午夜激情av| 亚洲国产美女搞黄色| www.一区二区| 亚洲欧洲日产国码二区| 国产成人av一区二区| 精品国产123| 久久99国产乱子伦精品免费| 欧美一区二区三区四区视频| 天堂在线亚洲视频| 777精品伊人久久久久大香线蕉| 91麻豆精品国产自产在线观看一区| 欧美一二三四在线| 免费一级欧美片在线观看| 欧美美女直播网站| 日韩电影一二三区| 日韩精品一区二区三区蜜臀 | 中文字幕日韩av资源站| 国产**成人网毛片九色| 国产精品天干天干在线综合| 国产精品白丝av| 国产精品福利一区二区三区| av午夜一区麻豆| 亚洲男人电影天堂| 欧美人妇做爰xxxⅹ性高电影| 久久久亚洲综合| 成人av先锋影音| 亚洲摸摸操操av| 欧美四级电影网| 久久精品噜噜噜成人av农村| 日韩一区二区免费在线电影| 国产精品资源在线看| 最新热久久免费视频| 欧洲人成人精品| 免费一级片91| 一区二区中文视频| 欧美精品亚洲一区二区在线播放| 国产欧美日本一区二区三区| 不卡区在线中文字幕| 亚洲一区av在线| 欧美日韩精品福利| 激情av综合网| 亚洲美女精品一区| 日韩一卡二卡三卡国产欧美| 国产成人免费视频一区| 一区二区不卡在线播放 | 日韩中文字幕91| 精品国产一区二区在线观看| 成人晚上爱看视频| 亚洲国产日韩在线一区模特| 精品少妇一区二区三区在线播放| 亚洲精品视频在线观看免费| 欧美美女网站色| 极品美女销魂一区二区三区| 亚洲精品视频在线看| 日韩欧美一区在线观看| av网站一区二区三区| 免费观看一级特黄欧美大片| 亚洲情趣在线观看| 久久综合色播五月| 欧美三区在线观看| 国产91丝袜在线观看| 图片区小说区区亚洲影院| 中文字幕日本不卡| 国产亚洲自拍一区| 日韩欧美国产麻豆| 欧美三级中文字幕在线观看| 99精品热视频| 国产不卡视频一区| 久久国产尿小便嘘嘘尿| 亚洲综合视频在线| 亚洲品质自拍视频| 国产精品网站在线| 国产欧美日韩另类一区| 精品国产区一区| 欧美一区二区福利在线| 欧美色视频一区| 一本在线高清不卡dvd| 成人午夜在线播放| 国产一区二区免费在线| 蜜桃视频一区二区三区在线观看| 日韩精品中午字幕| 6080国产精品一区二区| 欧美视频一二三区| av不卡免费电影| 成人av在线观| youjizz久久| 一本大道av伊人久久综合| 高清视频一区二区| 国产91丝袜在线播放0| 国产酒店精品激情| 国产一区二区在线电影| 九色综合狠狠综合久久| 久久国产精品露脸对白| 激情欧美一区二区三区在线观看| 国产精品久久久久久久久免费丝袜| 91小视频在线观看| 91丝袜呻吟高潮美腿白嫩在线观看| 亚洲精品欧美激情| 日韩美女视频一区二区 | 在线一区二区三区| 91精彩视频在线| 欧美午夜一区二区三区免费大片| 六月丁香综合在线视频| 国内精品第一页| 成人国产电影网| 91在线精品秘密一区二区| 91成人国产精品| 在线看日本不卡| 欧美一区二区三区四区五区| www国产成人| 亚洲欧洲另类国产综合| 亚洲美女免费在线| 色综合久久久久久久久久久| 欧美日韩一区二区三区四区五区| 国产乱对白刺激视频不卡| 国产suv精品一区二区6| 风流少妇一区二区| 色丁香久综合在线久综合在线观看| 久久电影国产免费久久电影| 国产不卡视频一区二区三区| 91丝袜美女网| 日韩一级高清毛片| 2021中文字幕一区亚洲| 国产精品国产自产拍高清av王其| 欧美xingq一区二区| 国产精品国模大尺度视频| 视频在线观看91| 国产乱子轮精品视频| 在线免费观看成人短视频| 91精品国产综合久久久蜜臀粉嫩| 91免费国产在线观看| 欧美一级黄色录像| 国产精品电影一区二区三区| 日本sm残虐另类| 99久久精品国产网站| 91麻豆精品国产91久久久资源速度 | 日韩欧美一二三区| 国产精品国产a级| 美国十次综合导航| av中文一区二区三区| 精品第一国产综合精品aⅴ| 国产精品无圣光一区二区| 日韩成人一区二区三区在线观看| 亚洲福利视频一区二区| 成人精品视频一区二区三区 | 日韩亚洲欧美高清| 亚洲国产精品av| 蜜桃视频在线观看一区二区| 日本精品一区二区三区高清| 国产亚洲成av人在线观看导航 | 日韩精品专区在线| 亚洲夂夂婷婷色拍ww47| 国产99久久久国产精品潘金| 在线播放日韩导航| 一区二区三区精品在线| 成人午夜伦理影院| 久久―日本道色综合久久| 天天影视色香欲综合网老头| 99精品视频中文字幕| 国产亚洲va综合人人澡精品| 另类中文字幕网| 欧美二区在线观看| 亚洲第四色夜色| 色吊一区二区三区| 17c精品麻豆一区二区免费| 成人小视频在线| 国产精品欧美久久久久一区二区| 亚洲乱码精品一二三四区日韩在线| 亚洲免费在线看| 成人黄色在线看| 久久久国产精品麻豆| 国产麻豆精品在线观看| 欧美变态tickle挠乳网站| 久久se精品一区精品二区| 67194成人在线观看| 视频一区二区三区在线| 91精品国产综合久久精品麻豆| 久久久99精品免费观看不卡| 国内久久精品视频| 亚洲精品一区二区三区福利| 精品在线播放免费|