📄 condition_sentence.cpp
字号:
falseadd=quad_len+1;
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=LLE1(); //
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=LLE1(); //
AD_RESULT(quad_len,equal,rtn,'-',c);
nexttoken();
}
}
}
//LL(1)文法分析
char LLE1()
{
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;
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<<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%4==0)
cout<<endl;
if(tokentable[token_index].type==$IF)
cout<<setw(10)<<"IF";
if(tokentable[token_index].type==$ELSE)
cout<<setw(10)<<"ELSE";
if(tokentable[token_index].type==$THEN)
cout<<setw(10)<<"THEN";
if(tokentable[token_index].type==$id)
cout<<setw(10)<<tokentable[token_index].ch;
if(tokentable[token_index].type==$num)
cout<<setw(10)<<tokentable[token_index].ch;
if(tokentable[token_index].type==$equal)
cout<<setw(10)<<'=';
if(tokentable[token_index].type==$greater)
cout<<setw(10)<<'>';
if(tokentable[token_index].type==$less)
cout<<setw(10)<<'<';
if(tokentable[token_index].type==$add)
cout<<setw(10)<<'+';
if(tokentable[token_index].type==$sub)
cout<<setw(10)<<'-';
if(tokentable[token_index].type==$mul)
cout<<setw(10)<<'*';
if(tokentable[token_index].type==$div)
cout<<setw(10)<<'/';
if(tokentable[token_index].type==$fenhao)
cout<<setw(10)<<';';
if(tokentable[token_index].type==$left_paren)
cout<<setw(10)<<'(';
if(tokentable[token_index].type==$right_paren)
cout<<setw(10)<<')';
}
token_index=0;
}
//输出四元式
void printQuad()
{
for(int i=0;i<quad_len;i++)
{
if(quad[i].label>-1)
cout<<"L"<<quad[i].label<<":";
else cout<<endl;
if(quad[i].op==JG)
{
cout<<"J>,"<<quad[i].par1<<","<<quad[i].par2<<",L"<<quad[i].address<<endl;
}
else if(quad[i].op==JL)
{
cout<<"J<,"<<quad[i].par1<<","<<quad[i].par2<<",L"<<quad[i].address<<endl;
}
else if(quad[i].op==JUMP)
{
cout<<"J ,"<<"-,-,L"<<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 + -