?? yufayuyi.cpp
字號:
AD_ADDRESS(quad_len,JL,a,b,trueadd);
AD_ADDRESS(quad_len,JUMP,0,0,falseadd);
}
}
else
ERROR("E(id/num)");
}
else
ERROR("E(greater/less)");
}
//分析語句
void sentence()
{ char rtn;
char c;
if(!nexttoken())
ERROR("S(0)");
if(cur.type==$id)
{
c=cur.ch;
if(!nexttoken())
ERROR("S(0)");
if(cur.type!=$equal)
ERROR("S(equal)");
push();
one=0;
rtn=LL1();
AD_RESULT(quad_len,equal,rtn,'-',c);
nexttoken();
while(cur.type==$id)
{
c=cur.ch;
if(!nexttoken())
ERROR("S(0)");
if(cur.type!=$equal)
ERROR("S(equal)");
push();
one=0;
rtn=LL1();
AD_RESULT(quad_len,equal,rtn,'-',c);
nexttoken();
}
}
}
//LL(1)文法分析
char LL1()
{
right=1; //開關項為1
flag=0;
char t;
base=(struct Lchar *)malloc(sizeof(Lchar)); //初始化堆棧
base->next=NULL;
base->char_ch='#';
temp=(struct Lchar *)malloc(sizeof(Lchar));
temp->next=base;
temp->char_ch='E';
top=temp; //初始化堆棧
t=dosome(); //開始識別
if(right) //如果開關項為1
cout<<"OK!"<<endl<<endl;
else
cout<<"Error!"<<endl;
return t;
}
//入棧函數
void pushs(char pchar)
{
temp=(struct Lchar *)malloc(sizeof(Lchar));
temp->char_ch=pchar;
temp->next=top;
top=temp;
}
//出棧函數
void pop(void)
{
curtocmp=top->char_ch;
if(top->char_ch!='#')
top=top->next;
}
//根據數組下標計算的值產生式入棧
void doforpush(int t)
{
switch(t)
{
case 0:pushs('A');pushs('T');break;
case 5:pushs('A');pushs('T');break;
case 11:pushs('A');pushs('T');pushs('+');break;
case 12:pushs('A');pushs('T');pushs('-');break;
case 20:pushs('B');pushs('F');break;
case 25:pushs('B');pushs('F');break;
case 33:pushs('B');pushs('F');pushs('*');break;
case 34:pushs('B');pushs('F');pushs('/');break;
case 40:pushs('i');break;
case 45:pushs(')');pushs('E');pushs('(');
}
}
//根據curchar,curtocmp轉為數字以判斷是否有產生式
void changchartoint()
{
switch(curtocmp)
{
case 'A':i=1;break;
case 'B':i=3;break;
case 'E':i=0;break;
case 'T':i=2;break;
case 'F':i=4;
}
switch(curchar)
{
case 'i':j=0;break;
case '+':j=1;break;
case '-':j=2;break;
case '*':j=3;break;
case '/':j=4;break;
case '(':j=5;break;
case ')':j=6;break;
case '#':j=7;
}
}
//算法函數
char dosome(void)
{
int t,a=0;
char bian1,bian2;
OpKind opa;
char c='$';
next();
for(;;)
{
pop();
if(cur.type!=$id && cur.type!=$num)
curchar=cur.ch;
else
curchar='i';
cout<<endl;
cout<<curchar<<" "<<curtocmp<<endl;
if(curtocmp=='#' && curchar=='#')
break;
if(curtocmp=='A' || curtocmp=='B' || curtocmp=='E'
|| curtocmp=='T' || curtocmp=='F') //當前字符為非終結符
{
if(curtocmp!='#')//當前比較字符不為'#'
{
changchartoint();
if(j==0)
{ a++;
flag++;
if(flag==1)
{ if(c=='$')
bian1=cur.ch;
else
bian1=c;
}
else if(flag==3)
{
bian2=cur.ch;
flag=1;
c=newchar();
AD_RESULT(quad_len,opa,bian1,bian2,c);//產生四元式
}
}
else
{
switch(j)
{
case 1:opa=add;flag++;break;
case 2:opa=sub;flag++;break;
case 3:opa=mul;flag++;break;
case 4:opa=div;flag++;
}
}
if(table[i][j]) //有產生式
{
t=10*i+j; //計算產生式在數組中的位置
doforpush(t);
continue;
}
else //沒有產生式
{
right=0; //出錯
break;
}
}
else //當前比較字符為'#'
if(curtocmp!=curchar)
{
right=0; //出錯
break;
}
else
break; //正確
}
else //當前字符為終結符
if(curtocmp!=curchar)
{
right=0; //出錯
break;
}
else
{
next(); //讀取下一個字符
continue;
}
}
if(a>1)
return c;
else
return bian1;
}
//產生數值語句的四元式
void AD_RESULT(int nlabel,OpKind nop,char npar1,char npar2, char nresult)
{quad[quad_len].label=nlabel;
quad[quad_len].op=nop;
quad[quad_len].par1=npar1;
quad[quad_len].par2=npar2;
quad[quad_len].result=nresult;
quad_len++;
}
//產生跳轉地址的四元式
void AD_ADDRESS(int nlabel,OpKind nop,char npar1,char npar2,int naddress)
{ quad[quad_len].label=nlabel;
quad[quad_len].op=nop;
quad[quad_len].par1=npar1;
quad[quad_len].par2=npar2;
quad[quad_len].address=naddress;
quad_len++;
}
//回填出口
void backpath(int nlabel,int addr)
{
quad[nlabel].address=addr;
}
//錯誤處理
void ERROR(char str[20])
{ label++;
cout<<endl;
cout<<"error! "<<str<<endl;
}
//輸出單詞表
void print()
{
for(token_index=0;token_index<total_len;token_index++)
{ if(token_index%100==0)
cout<<endl;
if(tokentable[token_index].type==$IF)
cout<<setw(2)<<"IF";
if(tokentable[token_index].type==$ELSE)
cout<<setw(2)<<" ELSE";
if(tokentable[token_index].type==$THEN)
cout<<setw(2)<<" THEN";
if(tokentable[token_index].type==$id)
cout<<setw(2)<<tokentable[token_index].ch;
if(tokentable[token_index].type==$num)
cout<<setw(2)<<tokentable[token_index].ch;
if(tokentable[token_index].type==$equal)
cout<<setw(2)<<'=';
if(tokentable[token_index].type==$greater)
cout<<setw(1)<<'>';
if(tokentable[token_index].type==$less)
cout<<setw(2)<<'<';
if(tokentable[token_index].type==$add)
cout<<setw(2)<<'+';
if(tokentable[token_index].type==$sub)
cout<<setw(2)<<'-';
if(tokentable[token_index].type==$mul)
cout<<setw(2)<<'*';
if(tokentable[token_index].type==$div)
cout<<setw(2)<<'/';
if(tokentable[token_index].type==$fenhao)
cout<<setw(2)<<';';
if(tokentable[token_index].type==$left_paren)
cout<<setw(2)<<'(';
if(tokentable[token_index].type==$right_paren)
cout<<setw(2)<<')';
}
token_index=0;
}
//輸出四元式
void printQuad()
{
for(int i=0;i<quad_len;i++)
{
if(quad[i].label>=0)
cout<<"("<<quad[i].label<<")"<<": ";
else cout<<endl;
if(quad[i].op==JG)
{
cout<<"("<<"j>,"<<quad[i].par1<<","<<quad[i].par2<<","<<quad[i].address<<")"<<endl;
}
else if(quad[i].op==JL)
{
cout<<"("<<"j<,"<<quad[i].par1<<","<<quad[i].par2<<","<<quad[i].address<<")"<<endl;
}
else if(quad[i].op==JUMP)
{
cout<<"("<<"j ,"<<"-,-,"<<quad[i].address<<")"<<endl;
}
else if(quad[i].op==equal)
{
if(quad[i-1].result==quad[i].par1)
cout<<"("<<":= ,"<<"T"<<quad[i].par1<<",-,"<<quad[i].result<<")"<<endl;
else
cout<<"("<<":= ,"<<quad[i].par1<<",-,"<<quad[i].result<<")"<<endl;
}
else if(quad[i].op==END)
{
cout<</*"("<<"-,-,-,-"<<")"<<*/endl;
}
else if(quad[i].op==add)
{ if(quad[i].result>='0' && quad[i].result<='9')
cout<<"("<<"+ ,"<<quad[i].par1<<","<<quad[i].par2<<","<<"T"<<quad[i].result<<")"<<endl;
else
cout<<"("<<"+ ,"<<quad[i].par1<<","<<quad[i].par2<<","<<quad[i].result<<")"<<endl;
}
else if(quad[i].op==sub)
{ if(quad[i].result>='0' && quad[i].result<='9')
cout<<"("<<"- ,"<<quad[i].par1<<","<<quad[i].par2<<","<<"T"<<quad[i].result<<")"<<endl;
else
cout<<"("<<"- ,"<<quad[i].par1<<","<<quad[i].par2<<","<<quad[i].result<<")"<<endl;
}
else if(quad[i].op==div)
{
if(quad[i].result>='0' && quad[i].result<='9')
cout<<"("<<"/ ,"<<quad[i].par1<<","<<quad[i].par2<<","<<"T"<<quad[i].result<<")"<<endl;
else
cout<<"("<<"/ ,"<<quad[i].par1<<","<<quad[i].par2<<","<<quad[i].result<<")"<<endl;
}
else if(quad[i].op==mul)
{ if(quad[i].result>='0' && quad[i].result<='9')
cout<<"("<<"* ,"<<quad[i].par1<<","<<quad[i].par2<<","<<"T"<<quad[i].result<<")"<<endl;
else
cout<<"("<<"* ,"<<quad[i].par1<<","<<quad[i].par2<<","<<quad[i].result<<")"<<endl;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -