?? plxcompiler.cpp
字號:
vector<item>::iterator iter=this->position(m_id);
if(NULL==iter)
{
error(1); //變量為定義
}
else
{
if(iter->kind!=aident)
{
error(13);//getSym();
}
else
{
gen(LOD,level-iter->level,iter->adr);
}
}
getSym();
}
else if(m_sym==NUMBER)
{
gen(LIT,0,this->m_num);
getSym();
}
else
{
error(13);//此處為一個整型變量名
}
gen(OPR,0,14);//>
cx2=m_cx;
gen(JPC,0,0);
if(m_sym!=TOSYM)
{
error(28); //缺了to
}
else
getSym();
gen(LOD,level-_item.level,_item.adr);
if(m_sym==IDENT)
{
//查找符號表
vector<item>::iterator iter=this->position(m_id);
if(NULL==iter)
{
error(1); //變量為定義
}
else
{
if(iter->kind!=aident)
{
error(13);
}
else
{
gen(LOD,level-iter->level,iter->adr);
}
}
getSym();
}
else if(m_sym==NUMBER)
{
gen(LIT,0,this->m_num);
getSym();
}
else
{
error(13);//此處為一個整型變量名
}
gen(OPR,0,11);//<
cx3=m_cx;
gen(JPC,0,0);
if(m_sym!=DOSYM)
{
error(26);
}
else
getSym();
tmp.clear();
set_union(fsys.begin(),fsys.end(),m_followss.begin(),m_followss.end(),insert_iterator<symset>(tmp,tmp.begin()));
this->SentenceSque(level,tmp);
gen(LOD,level-_item.level,_item.adr);
gen(OPR,0,17);
gen(STO,level-_item.level,_item.adr);
gen(JMP,0,cx1);
(*(m_code.begin()+cx2)).a=m_cx;
(*(m_code.begin()+cx3)).a=m_cx;
if(m_sym==ENDSYM)
{
getSym();
}
else
{
error(11);//缺了end
}
}
else if(m_sym==CALLSYM)
{
getSym();
if(m_sym==IDENT)
{
//查找符號表
pfunction=this->position(m_id);
if(NULL==pfunction)
{
error(1); //變量為定義
}
else
{
if(pfunction->kind!=pident)
{
error(29);
}
else
{
cx1=m_cx;
gen(CAL,level-pfunction->level,pfunction->adr);
num=pfunction->num;
pParameter=pfunction;
getSym();
while(m_sym==NUMBER || m_sym==IDENT)
{
if(num>0)
pParameter++;
if(m_sym==NUMBER)
{
gen(LIT,0,this->m_num);
gen(ADP,0,pParameter->adr);
getSym();
}
else
{
//查找符號表
vector<item>::iterator iter=this->position(m_id);
if(NULL==iter)
{
error(1); //變量為定義
}
else
{
if(iter->kind!=aident)
{
error(13);//getSym();
}
else
{
gen(LOD,pfunction->level+1-iter->level,iter->adr);
gen(ADP,0,pParameter->adr);
}
}
getSym();
}
k++;
}
if(k!=num)
{
error(39);//參數(shù)個數(shù)不符
}
}
gen(JMP,0,pfunction->adr);
(*(m_code.begin()+cx1)).a=m_cx; ///?????
}
}
else
{
error(29);
}
}
else
{
error(30);
}
tmp.clear();
tmp=this->m_firsts;
tmp.insert(ENDSYM);
test(fsys,tmp,31);
}
//處理非終結(jié)符d
void PLXCompiler::Definition(int level,int &dx,symset fsys)
{
symset tmp,follow;
tmp.insert(INTESYM);
tmp.insert(LOGISYM);
test(tmp,fsys,20);
if(m_sym==INTESYM)
{
getSym();
if(m_sym==IDENT)
{
//在符號表中登記變量
enter(aident,dx,level);
}
else
{
error(7);//非法的變量名
}
getSym();
while(m_sym==COMMA || m_sym==IDENT)
{
if(m_sym==COMMA)
getSym();
else
error(19);
if(m_sym==IDENT)
{
//在符號表中登記變量
enter(aident,dx,level);
}
else
{
error(7);//非法的變量名
}
getSym();
}
}
else if(m_sym==LOGISYM)
{
getSym();
if(m_sym==IDENT)
{
//在符號表中登記變量
enter(bident,dx,level);
}
else
{
error(7);//非法的變量名
}
getSym();
while(m_sym==COMMA || m_sym==IDENT)
{
if(m_sym==COMMA)
getSym();
else
error(19);
if(m_sym==IDENT)
{
//在符號表中登記變量
enter(bident,dx,level);
}
else
{
error(7);//非法的變量名
}
getSym();
}
}
follow.insert(PROSYM);
follow.insert(BEGINSYM);
follow.insert(INTESYM);
follow.insert(LOGISYM);
follow.insert(SEMICOLON);
test(follow,tmp,21);
}
//處理非終結(jié)符ss
void PLXCompiler::SentenceSque(int level,symset fsys)
{
symset tmp;
if(m_firsts.find(m_sym)!=m_firsts.end())
{
tmp.clear();
set_union(fsys.begin(),fsys.end(),m_follows.begin(),m_follows.end(),insert_iterator<symset>(tmp,tmp.begin()));
this->Sentence(level,tmp);
while(m_sym==SEMICOLON ||m_firsts.find(m_sym)!=m_firsts.end())
{
if(m_sym==SEMICOLON)
getSym();
else
error(16);//丟失';'
if(m_sym==ENDSYM || m_sym==ELSESYM || m_sym==UNTILSYM)
{
error(36);
break;
}
this->Sentence(level,tmp);
}
}
tmp.clear();
tmp.insert(ENDSYM);
test(fsys,tmp,17);//跳到end出
}
//處理非終結(jié)符ds
void PLXCompiler::DefinitionSque(int level,int &dx,symset fsys)
{
symset fd,tmp,stop;
//tmp.insert(INTESYM);
//tmp.insert(LOGISYM);
//test(tmp,fsys,20);
if(m_sym==INTESYM || m_sym==LOGISYM)
{
fd=fsys;
fd.insert(SEMICOLON);
fd.insert(BEGINSYM);
fd.insert(PROSYM);
this->Definition(level,dx,fd);
while(m_sym==SEMICOLON ||m_sym==INTESYM || m_sym==LOGISYM)
{
if(m_sym==SEMICOLON)
getSym();
else
error(16);
//getSym();
if(m_sym==PROSYM || m_sym==BEGINSYM /*||(m_firsts.find(m_sym)!=m_firsts.end())*/)
{
error(36); // 多余的';'
break;
}
this->Definition(level,dx,fd);
}
tmp.clear();
//tmp.insert(PROSYM);
tmp.insert(BEGINSYM);
test(fsys,tmp,18);
}
else
{
tmp.clear();
//tmp.insert(PROSYM);
tmp.insert(BEGINSYM);
stop=this->m_firsts;
stop.erase(IDENT);
stop.insert(PROSYM);
test(tmp,stop,18);
}
}
//處理非終結(jié)符proc
void PLXCompiler::Program(symset fsys)
{
int dx=3,tx; //記錄變量的偏移量
item _item;
memset(&_item,'\0',sizeof(_item));
_item.adr=m_cx;//記錄當(dāng)前層代碼的開始位置
m_table.push_back(_item);
vector<item>::iterator pt;
tx=m_tx;//記錄該層符號在符號表中的開始位置
m_tx++;
gen(JMP,0,0);
symset fds,fPro,fss,tmp;
if(m_sym==PROGSYM)
{
getSym();
}
else
{
//error(12);//開始符號不是program
tmp.insert(INTESYM);
tmp.insert(LOGISYM);
tmp.insert(PROSYM);
tmp.insert(BEGINSYM);
test(tmp,fsys,12);
}
//添加begin即ds的跟隨符號到fds中
fds=fsys;
//fds.insert(BEGINSYM);
this->DefinitionSque(0,dx,fds);
if(m_sym!=BEGINSYM)
{
error(10); //
}
else
getSym();
//添加proc的跟隨符號到fsys中
fPro=fsys;
fPro.insert(ENDSYM);
fPro.insert(IDENT);
fPro.insert(IFSYM);
fPro.insert(WHILESYM);
fPro.insert(REPEATSYM);
fPro.insert(WRITESYM);
fPro.insert(READSYM);
fPro.insert(FORSYM);
fPro.insert(CALLSYM);
//this->Procedure(fPro);
this->ProcedureSque(0,fPro);
fss=fsys;
fss.insert(ENDSYM);
pt=m_table.begin()+tx;
if(pt!=NULL)
{
(*((m_code.begin()+pt->adr))).a=m_cx;
pt->adr=m_cx;
pt->size=dx;
}
gen(INT,0,dx);
this->SentenceSque(0,fss);
gen(OPR,0,0);//RETURN
if(m_sym==ENDSYM)
{
getSym();
if(m_sym!=PERIOD)
{
error(0);
}
}
else
{
error(11);
}
}
void PLXCompiler::gen(fct f,int l,int a)
{
if(l<0)
{
error(42);
}
instruction ins;
ins.f=f;
ins.a=a;
ins.l=l;
m_code.push_back(ins);
m_cx++;
}
void PLXCompiler::listCode()
{
char op[4]={'\0'};
int num=0;
printf("PCODE:\n");
vector<instruction>::iterator p=m_code.begin();
for(;p!=m_code.end();p++,num++)
{
switch(p->f)
{
case LIT:
strcpy(op,"LIT");
break;
case OPR:
strcpy(op,"OPR");
break;
case LOD:
strcpy(op,"LOD");
break;
case STO:
strcpy(op,"STO");
break;
case CAL:
strcpy(op,"CAL");
break;
case INT:
strcpy(op,"INT");
break;
case JMP:
strcpy(op,"JMP");
break;
case JPC:
strcpy(op,"JPC");
break;
case ADP:
strcpy(op,"ADP");
break;
}
printf("%-3d:%s %d %-2d\n",num,op,p->l,p->a);
}
}
//
int PLXCompiler::base(int l)
{
int b1=m_b;
while(l>0)
{
b1=m_s[b1];
l--;
}
return b1;
}
//
void PLXCompiler::plxInterpret()
{
instruction i;
int tmp;
int offset=0;
int flag=0;
vector<instruction>::iterator pcode=this->m_code.begin();
if(this->m_err>0)
{
return;
}
printf("%s\n","----Start PLX----");
m_t=0;
m_b=1;
m_p=0;
m_s[1]=0;
m_s[2]=0;
m_s[3]=0;
do
{
i=*(pcode+m_p);
m_p++;
switch(i.f)
{
case LIT:
m_t++;
m_s[m_t]=i.a;
break;
case OPR:
switch(i.a)
{
case 0: //返回
m_t=m_b-1;
m_p=m_s[m_t+3];
m_b=m_s[m_t+2];
break;
case 1: //取負(fù)
m_s[m_t]=-m_s[m_t];
break;
case 2: //相加
m_t--;
m_s[m_t]+=m_s[m_t+1];
break;
case 3: //相減
m_t--;
m_s[m_t]-=m_s[m_t+1];
break;
case 4: //相乘
m_t--;
m_s[m_t]*=m_s[m_t+1];
break;
case 5: //相除
m_t--;
if(m_s[m_t+1]==0)
{
error(43);
return;
}
m_s[m_t]/=m_s[m_t+1];
break;
case 6: //or
m_t--;
m_s[m_t]=(m_s[m_t] || m_s[m_t+1])?1:0;
break;
case 7: //and
m_t--;
m_s[m_t]=(m_s[m_t] && m_s[m_t+1])?1:0;
break;
case 8: //not
m_s[m_t]=(m_s[m_t])?0:1;
break;
case 9: //=
m_t--;
m_s[m_t]=(m_s[m_t]==m_s[m_t+1])?1:0;
break;
case 10: // /=
m_t--;
m_s[m_t]=(m_s[m_t]!=m_s[m_t+1])?1:0;
break;
case 11: // <
m_t--;
m_s[m_t]=(m_s[m_t]<m_s[m_t+1])?1:0;
break;
case 12: // <=
m_t--;
m_s[m_t]=(m_s[m_t]<=m_s[m_t+1])?1:0;
break;
case 13: // >
m_t--;
m_s[m_t]=(m_s[m_t]>m_s[m_t+1])?1:0;
break;
case 14: // >=
m_t--;
m_s[m_t]=(m_s[m_t]>=m_s[m_t+1])?1:0;
break;
case 15: // write
m_t--;
printf("%d\n",m_s[m_t+1]);
break;
case 16: //read
printf("Input numbers:\n");
scanf("%d",&tmp);
m_t++;
m_s[m_t]=tmp;
break;
case 17:
m_s[m_t]++;
break;
}
break;
case LOD:
m_t++;
m_s[m_t]=m_s[base(i.l)+i.a];
break;
case STO:
m_s[base(i.l)+i.a]=m_s[m_t];
m_t--;
break;
case CAL:
offset=0;
m_s[m_t+1]=base(i.l);
m_s[m_t+2]=m_b;
m_s[m_t+3]=i.a;
m_b=m_t+1;
m_t+=3;
break;
case INT:
flag++;
if(flag==1)//表示在主程序里
m_t+=i.a;
else
m_t+=i.a-3;
break;
case JMP:
m_p=i.a;
break;
case JPC:
if(m_s[m_t]==0)
{
m_p=i.a;
}
m_t--;
break;
case ADP:
m_s[m_t+3+offset]=m_s[m_t];
//fprintf(pfResult,"%d\n",m_s[m_t]);
//m_t--;
offset++;
break;
}
}
while(m_p!=0);
printf("%s\n","----End PLX----");
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -