?? main.cpp
字號:
#include<iostream.h>
#include<fstream.h>
#include"scanner.h"
#include"function&struct.h"
#include"stack.h"
///////////////////////////////////////////////////////////////////////////////////////////
//全局變量定義
int flag=1; //判斷程序是否出錯,開始時置1為正確
extern int lineno; //行號,于Scanner.h中定義
char token[11]; //字符緩沖區
table* t_first; //數據區的首指針
quad* q_first,*q_last; //四元式鏈的首,末指針
char label_temp[10][11]; //標識符的臨時數組,只是在IDT中用到,默認只能存十個
stack<int> Stack;
int temp_vary=2001; //生成四元式時用到的臨時變量序號
int numoflabel; //標識符緩沖區
///////////////////////////////////////////////////////////////////////////////////////////
//語義函數定義
int BLK(ifstream&,int);
int constant(ifstream&,int);
int vary(ifstream&,int);
int funcpro(ifstream&,int);
int CS(ifstream&,int);
int IDT(ifstream&,int);
int sentence(ifstream&,int,int&);
int ET(ifstream&,int);
int CE(ifstream&,int,int&,int&);
int E(ifstream&,int);
int T(ifstream&,int);
int F(ifstream&,int);
//出錯函數
void error(int);
///////////////////////////////////////////////////////////////////////////////////////////
void main( )
{
int a;
t_first=new table(NULL,-1);
t_first->next=NULL;
ifstream sf("c:\\file.txt");
if(sf.fail())
{
cerr<<"error opening file file.txt\n";
return;
}
a=scanner(sf);
if(a==13) a=scanner(sf);
if(a==21) a=scanner(sf);
if(a!=24)
error(13);
else
a=scanner(sf);
a=BLK(sf,a);
if(a!=26)
error(14);
cout<<"this syntax has been completed!"<<endl;
if(flag)
cout<<"this grammar of source program is regular."<<endl;
else
cout<<"this grammar of source program is wrong!"<<endl;
sf.close();
quad* p=q_first;
while(p!=NULL&&flag==1)
{
cout<<p->num<<"( "<<p->OP<<","<<p->arg1<<","<<p->arg2<<","<<p->result<<")"<<endl;
p=p->next;
}
}
///////////////////////////////////////////////////////////////////////////////////////////
void error(int err)
{
cout<<lineno<<" line! :";
switch(err)
{
case 0: cout<<" expected'('"<<endl; break;
case 1: cout<<" expected'因子'"<<endl; break;
case 2: cout<<" expected':='"<<endl; break;
case 3: cout<<" expected'then'"<<endl; break;
case 4: cout<<" expected'do'"<<endl; break;
case 5: cout<<" expected')'"<<endl; break;
case 6: cout<<" expected'begin'"<<endl; break;
case 7: cout<<" expected'end'"<<endl; break;
case 8: cout<<" expected'標識符'"<<endl;break;
case 9: cout<<" expected'常量'"<<endl; break;
case 10: cout<<" expected'='"<<endl; break;
case 11: cout<<" expected':'"<<endl; break;
case 12: cout<<" 缺interger說明"<<endl; break;
case 13: cout<<" expected';'"<<endl; break;
case 14: cout<<" expected'.'"<<endl; break;
case 15: cout<<" 不認識字符"<<endl; break;
case 16: cout<<" 標識符重定義"<<endl; break;
case 17: cout<<" 整數越界"<<endl; break;
case 18: cout<<" 標識符未定義"<<endl; break;
default: cout<<" ..."<<endl; break;
}
flag=0;
}
///////////////////////////////////////////////////////////////////////////////////////////
int BLK(ifstream& sf,int a)
{
if(a==27) //過程定義
{
a=scanner(sf);
//缺處理形參
if(a!=28) //存在形參的處理
{
a=IDT(sf,a);
if(a!=25) //缺:
error(11);
else
a=scanner(sf);
if(a!=9) //缺interger
error(12);
else
a=scanner(sf);
}
if(a!=28) //缺 )
error(5);
else
a=scanner(sf);
if(a!=25) //缺:
error(11);
else
a=scanner(sf);
if(a!=9) //缺interger
error(12);
else
a=scanner(sf);
if(a!=24) //缺;
error(13);
else
a=scanner(sf);
}
if(a==2) //常量定義
{
a=scanner(sf);
a=constant(sf,a);
}
if(a==18) //變量說明
{
a=scanner(sf);
a=vary(sf,a);
}
if(a==7) //函數說明
{
a=scanner(sf);
a=funcpro(sf,a);
}
while(a==7)
{
a=scanner(sf);
a=funcpro(sf,a);
}
if(a!=1) //復合語句
error(6);
else
{
a=scanner(sf);
a=CS(sf,a);
}
if(a!=24&&a!=26) //缺';'或者'.'
{
error(13);
}
return a;
}
///////////////////////////////////////////////////////////////////////////////////////////
int constant(ifstream& sf,int a)
{
if(a==21) a=scanner(sf);
if(a==38) a=scanner(sf);
if(a==22)
{
fill(token,1);//填表
a=scanner(sf);
}
while(a==23)
{
a=scanner(sf);
if(a==21) a=scanner(sf);
if(a==38) a=scanner(sf);
if(a==22)
{
fill(token,1);//填表
a=scanner(sf);
}
}
if(a==24)
a=scanner(sf);
else
error(13);
return a;
}
///////////////////////////////////////////////////////////////////////////////////////////
int vary(ifstream& sf,int a)
{
int temp=0;
a=IDT(sf,a);
if(a==25) a=scanner(sf);
if(a==9)
{
while(temp<numoflabel)
fill(label_temp[temp++],0); //此處需填表
a=scanner(sf);
}
/* while(a==24) //當有多種數據類型時,被遮蔽的代碼會有用
{
numoflabel=0;
a=scanner(sf);
a=IDT(sf,a);
if(a==25) a=scanner(sf);
if(a==9)
{
while(label_temp[numoflabel])
fill(label_temp[numoflabel++],0); //此處需填表
a=scanner(sf);
}
}
*/
if(a==24)
a=scanner(sf);
else
error(13);
return a;
}
///////////////////////////////////////////////////////////////////////////////////////////
int funcpro(ifstream& sf,int a)
{
if(a==21) a=scanner(sf);
a=BLK(sf,a);
if(a!=24)
error(13);
else
a=scanner(sf);
return a;
}
///////////////////////////////////////////////////////////////////////////////////////////
int CS(ifstream& sf,int a)
{
int C_CHAIN;
a=sentence(sf,a,C_CHAIN);
while(a==24)
{
int NXQ=q_last->num+1;
a=scanner(sf);
backpatch(C_CHAIN,NXQ);
a=sentence(sf,a,C_CHAIN);
}
if(a!=6)
error(7);
else
a=scanner(sf);
return a;
}
///////////////////////////////////////////////////////////////////////////////////////////
int IDT(ifstream& sf,int a)
{
numoflabel=0;
if(a==21)
{
strcpy(label_temp[numoflabel++],token);
a=scanner(sf);
}
while(a==23)
{
a=scanner(sf);
if(a==21)
{
strcpy(label_temp[numoflabel++],token);
a=scanner(sf);
}
}
return a;
}
///////////////////////////////////////////////////////////////////////////////////////////
int sentence(ifstream& sf,int a,int& S_CHAIN)
{
int temp=0;
int E_TC,E_FC,S1_CHAIN,S2_CHAIN,W_QUAD;
switch(a)
{
case 21:
Stack.Push(entry(token));
a=scanner(sf);
if(a==44) a=scanner(sf); //賦值語句
a=E(sf,a);
Gen(":=",Stack.Pop(),Stack.Pop(),-1);
S_CHAIN=0;
break;
case 1: a=scanner(sf);
a=CS(sf,a); //復合語句
S_CHAIN=0;
break;
case 8:
a=scanner(sf);
a=CE(sf,a,E_TC,E_FC); //if語句
if(a!=16)
error(3);
else{
backpatch(E_TC,q_last->num+1);
a=scanner(sf);
}
a=sentence(sf,a,S1_CHAIN);
if(a==5)
{
int NXQ=q_last->num+1;
a=scanner(sf);
Gen("j",0,-1,-1);
backpatch(E_FC,NXQ);
merg(S1_CHAIN,NXQ);
a=sentence(sf,a,S2_CHAIN);
S_CHAIN=merg(S1_CHAIN,S2_CHAIN);//書上為T_CHAIN
return a;
}
S_CHAIN=merg(E_FC,S1_CHAIN);
break;
case 19: W_QUAD=q_last->num+1;
a=scanner(sf);
a=CE(sf,a,E_TC,E_FC); //while語句
if(a==4)
{
a=scanner(sf);
backpatch(E_TC,q_last->num+1);
a=sentence(sf,a,S1_CHAIN);
backpatch(S1_CHAIN,W_QUAD);
Gen("j",W_QUAD,-1,-1);
S_CHAIN=E_FC;
}
else
error(4);
break;
case 14: a=scanner(sf);
if(a==27) //read語句
a=scanner(sf);
else
error(0);
a=IDT(sf,a);
if(a==28)
{
while(temp<numoflabel)
Gen("in",entry(label_temp[temp++]),-1,-1);
a=scanner(sf);
}
else
error(5);
S_CHAIN=0;
break;
case 20: a=scanner(sf);
if(a==27) //write語句
a=scanner(sf);
else
error(0);
a=ET(sf,a);
if(a==28)
{
stack<int> tempstack; //建立一個臨時棧,完成Stack棧的倒棧
while(!Stack.IsEmpty())
tempstack.Push(Stack.Pop());//
while(!tempstack.IsEmpty())
Gen("out",tempstack.Pop(),-1,-1);
a=scanner(sf);
}
else
error(5);
S_CHAIN=0;
break;
default:
S_CHAIN=0;
break;
}
return a;
}
///////////////////////////////////////////////////////////////////////////////////////////
int ET(ifstream& sf,int a)
{
a=E(sf,a);
while(a==23)
{
a=scanner(sf);
a=E(sf,a);
}
return a;
}
///////////////////////////////////////////////////////////////////////////////////////////
int CE(ifstream& sf,int a,int& E_TC,int& E_FC)
{
a=E(sf,a);
while(a>=38&&a<=43)
{
int temp=a;
a=scanner(sf);
a=E(sf,a);
switch(temp)
{
case 38: E_TC=q_last->num+1;
E_FC=q_last->num+2;
Gen("jeq",0,Stack.Pop(),Stack.Pop());
Gen("j",0,-1,-1);
break;
case 39: E_TC=q_last->num+1;
E_FC=q_last->num+2;
Gen("jl",0,Stack.Pop(),Stack.Pop());
Gen("j",0,-1,-1);
break;
case 40: E_TC=q_last->num+1;
E_FC=q_last->num+2;
Gen("jg",0,Stack.Pop(),Stack.Pop());
Gen("j",0,-1,-1);
break;
case 41: E_TC=q_last->num+1;
E_FC=q_last->num+2;
Gen("jne",0,Stack.Pop(),Stack.Pop());
Gen("j",0,-1,-1);
break;
case 42: E_TC=q_last->num+1;
E_FC=q_last->num+2;
Gen("jle",0,Stack.Pop(),Stack.Pop());
Gen("j",0,-1,-1);
break;
case 43: E_TC=q_last->num+1;
E_FC=q_last->num+2;
Gen("jge",0,Stack.Pop(),Stack.Pop());
Gen("j",0,-1,-1);
break;
}
}
return a;
}
///////////////////////////////////////////////////////////////////////////////////////////
int E(ifstream& sf,int a) //沒有處理單目運算符
{
a=T(sf,a);
while(a==34||a==35)
{
int temp=a;
a=scanner(sf);
a=T(sf,a);
switch(temp)
{
case 34: Gen("+",temp_vary,Stack.Pop(),Stack.Pop());
Stack.Push(temp_vary++);
break;
case 35: Gen("-",temp_vary,Stack.Pop(),Stack.Pop());
Stack.Push(temp_vary++);
break;
}
}
return a;
}
///////////////////////////////////////////////////////////////////////////////////////////
int T(ifstream& sf,int a)
{
a=F(sf,a);
while(a==3||a==36||a==37)
{
int temp=a;
a=scanner(sf);
a=F(sf,a);
switch(temp)
{
case 3: Gen("div",temp_vary,Stack.Pop(),Stack.Pop());
Stack.Push(temp_vary++);
break;
case 36: Gen("*",temp_vary,Stack.Pop(),Stack.Pop());
Stack.Push(temp_vary++);
break;
case 37: Gen("/",temp_vary,Stack.Pop(),Stack.Pop());
Stack.Push(temp_vary++);
break;
}
}
return a;
}
///////////////////////////////////////////////////////////////////////////////////////////
int F(ifstream& sf,int a) //因子文法沒有改寫
{
switch(a)
{
case 21: Stack.Push(entry(token));
a=scanner(sf);
if(a==27)
{
a=scanner(sf);
a=ET(sf,a);
if(a!=28)
error(5);
else
a=scanner(sf);
break;
}else
break;
case 27: a=scanner(sf);
a=E(sf,a);
if(a!=28)
error(5);
else
a=scanner(sf);
break;
case 22: Stack.Push(getconst());
a=scanner(sf);
break;
}
return a;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -