📄 compile.cpp
字号:
case '*':
case '/':
case ')':
case ';':
case '(':
case '\n':{ rem(mem,1);
break;}
default:error(1);//printf("gg%cpp",mid[count]);
break;
}
}
}
void mark(char &m)
{if(('0'<=mid[count]&&mid[count]<='9')||('a'<=mid[count]&&mid[count]<='z') )
{word[len]=mid[count];len++;
advance();
m=mid[count];
mark(m);
}
else {
switch(mid[count])
{case '\0':
case '.':
case '\n':
case ' ':if( key()){break; }
case '>':
case '<':
case '=':
case '+':
case '-':
case '*':
case '/':
case ')':
case ',':
case ':':
case ';':{rem(mem,2);
break;
}
default:error(2);count++; break;
}
}
}
void start(char &m)
{
int door=0;
// printf("[");
if('0'<=mid[count]&&mid[count]<='9'){door=1;}
else if('a'<=mid[count]&&mid[count]<='z')door=2;
if(door==1){len=0;num(m);}
else {if(door==2){len=0;mark(m); }
else {
switch(mid[count])
{case '<':count++;word[0]='<';
if(mid[count]=='='){word[1]='=';count++;rem(mem,27);}
else{ if(mid[count]=='>'){word[1]='>';count++;rem(mem,30);}
else {rem(mem,14); }
}
break;
case '>':count++;word[0]='>';
if(mid[count]=='='){word[1]='=';count++;rem(mem,28);}
else{ rem(mem,15); }
break;
case '=':word[0]='=';count++;rem(mem,16);break;
case '+':word[0]='+';count++;rem(mem,17);break;
case '-':word[0]='-';count++;rem(mem,18);break;
case '*':word[0]='*';count++;rem(mem,19);break;
case '/':word[0]='/';count++;rem(mem,20);break;
case '(':word[0]='(';count++;rem(mem,21);break;
case ')':word[0]=')';count++;rem(mem,22);break;
case ';':word[0]=';';count++;rem(mem,23);break;
case ',':word[0]=',';count++;rem(mem,24);break;
case '.':word[0]='.';count++;rem(mem,25);break;
case ':':count++;word[0]=':';
if(mid[count]=='='){word[1]='=';count++;rem(mem,29);}
else{ rem(mem,26); }
break;
case ' ':count++;break;
case '\n':count++; break;
default:error(3);count++;break;
}
}
}
}
int relationexp()
{int i=0;int a,b;int c;
while(!wrong&&count<=mem.length&&!expaction(l,getstate(),strtono()))
{ }
a=l.row[l.length+1][2]; //printf("rlationexp nowvalue1=%s\n",mem.row[count].value);
if(!wrong&&(match(14)||match(15)||match(16)||match(28)||match(27)||match(30)))
{ switch(mem.row[count].no)
{case 15:c=3;break;
case 14:c=4;break;
case 28:c=5;break;
case 27:c=6;break;
case 16:c=7;break;
case 30:c=8;break;
}
count++;//printf("nowvalue2=%s\n",mem.row[count].value);
while(!wrong&&count<=mem.length&&!expaction(l,getstate(),strtono()))
{ }
b=l.row[l.length+1][2];
if(!wrong){i=1;gen(c,a,b,0);c=9;gen(c,0,0,0);}
}
if(i==0)error(9);
return i;
}
void backpath(int i,int j)
{if(i<fourlist.length&&j<=fourlist.length)
fourlist.row[i].addr=j;
else error(15);//printf("backpath error.");
}
int sentence()
{int i=0; int p,q;
switch(mem.row[count].no)
{case 6:{count++;
while(count<mem.length)
{if(sentence())count++;
if(mem.row[count].no==7)break;
}
// printf("llll[%s,%d],c%d,l%d",mem.row[count].value,mem.row[count].no,count,mem.length);
if(mem.row[count].no==7){i=1;if((count+1==mem.length)&&mem.row[count+1].no!=25){i=0;error(17);}
}
if(i==0) error(4);
break;
}
case 8:{
count++;
// printf("klklk<%s>",mem.row[count].value);
if(relationexp())
{ p=fourlist.length-2;
if(match(9))
{ backpath(p,fourlist.length);
count++;
if(!match(8))
{
if(sentence())
{
q=fourlist.length;
gen(9,0,0,0);
backpath(p+1,fourlist.length);
count++;
i=1;//printf("kkk%s",mem.row[count].value);
if(match(10)){count++; if(sentence())i=1;
}
else count--;
backpath(q,fourlist.length);
}
}
else error(19);
}
else error(20);
}//printf("%s",mem.row[count].value);
if(i==0)error(5);
break;
}
case 2:{p=lookup(mem.row[count].value);
strcpy(variable.row[p].name,mem.row[count].value);
count++;//
if(mem.row[count].no==29)
{count++; while(!wrong&&count<=mem.length&&!expaction(l,getstate(),strtono()))
{ }
if(!wrong){i=1;variable.row[p].value=variable.row[l.row[l.length+1][2]].value;
// printf("give %s=%d \n",variable.row[l.row[l.length+1][2]].name,variable.row[l.row[l.length+1][2]].value);
}
// else printf("expresion wrong");
if(mem.row[count].no!=23){i=0;error(10);}
}
else error(21);
// printf("n<%d,%s>\n",mem.row[count].no,mem.row[count].value);
// count++;
if(i==0)error(7);
else gen(2,l.row[l.length+1][2],0,p);
break;
}
case 11:{count++;//printf("k<%d,%s>\n",mem.row[count].no,mem.row[count].value);
p=fourlist.length;
if(relationexp())
{ q=fourlist.length-2;
if(match(12))
{backpath(q,fourlist.length);
count++;
if(sentence())i=1;
gen(9,0,0,p);
backpath(q+1,fourlist.length);
}
}else error(18);
if(i==0)error(6);
break;
}
default:error(8);count=mem.length;return 0;
}
return i;
}
main()
{char m;mem.length=0;fourlist.length=0;variable.length=-1;
count=0;
printf("********************************************************\nplease enter filename:");
scanf("%s",b);
printf("********************************************************\n");
int i;i=0;
if((fp=fopen(b,"a+"))!=NULL)
{ while(i<max&&fread(&m,sizeof(char),1,fp) && !feof(fp))
{printf("%c",m);mid[i]=m;
i++;
}
mid[i]='\0';i--;
fclose(fp);
printf("\n");
while(count<=i){clear();
start(mid[0]);}
mem.row[mem.length].no=31;mem.row[mem.length].value[0]='#';
count=0;
for(count;count<mem.length;count++)
{ printf("(%d,%s) ",mem.row[count].no,mem.row[count].value);
if((count+1)%6==0)printf("\n");
}
printf("\n");
expactioninit();expgotoinit();
l.length=-1;
pushs(l,0);pushc(l,6,0);
count=0;
if( !sentence())wrong=1;
if(wrong==0)
{printf("compile success\n");
char opchar[10][4]={"+","*",":=","j>","j<","j>=","j<=","j=","j<>","j"};
for(int kk=0;kk<fourlist.length;kk++)
{printf("no=%d,(%s,",kk,opchar[fourlist.row[kk].op]);
if(fourlist.row[kk].op==9)printf("0,");
else{ if(variable.row[fourlist.row[kk].opn1].type==1)printf("%d,",variable.row[fourlist.row[kk].opn1].value);
else printf("%s,",variable.row[fourlist.row[kk].opn1].name);
}
if(fourlist.row[kk].op==9)printf("0,");
else {if(fourlist.row[kk].op!=2){ if(variable.row[fourlist.row[kk].opn2].type==1)printf("%d,",variable.row[fourlist.row[kk].opn2].value);
else printf("%s,",variable.row[fourlist.row[kk].opn2].name);
}
else {printf("0,");}
}
if(fourlist.row[kk].op<=2)
{
printf("%s)\n",variable.row[fourlist.row[kk].addr].name);
}
else printf("%d)\n",fourlist.row[kk].addr);
}
// for(int ii=0;ii<=variable.length;ii++)
// {printf("%s=%d; ",variable.row[ii].name,variable.row[ii].value);
// if ((ii+1)%5==0)printf("\n");
// }
}
}
else printf("can't open file.");
return 1;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -