📄 ver4.bak
字号:
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <process.h>
#include <stdlib.h>
#define SCANF 1
#define PRINTF 0
#define IF 2
#define INT 3
#define WHILE 4
#define TRANSVALUE 5
#define SYNTAXERROR 1
#define SIGNMISSING 3
#define BOOLERR 4
#define VARNAMETOOLONG 5
#define VARNOTFOUND 2
#define EXPERROR 6
#define LEFTMISSING 7
#define RIGHTMISSING 8
#define LEFTMISSINGB 9
#define RIGHTMISSINGB 10
#define VARNAMESPACE 11
#define VARNAMEERR 12
typedef struct vartype
{
char name[6];
int val;
}var;
typedef struct breakpttype
{
int line;
int row;
char cases[20];
}brkpt;
//struct defination
var varible[51];
brkpt brktable[51];
int varnum=0;
int flag=0;
int flagtable[51]={0};
int ifwal=0;
int text_row=0,text_line=0;
int temp_row=0,temp_line=0;
char part[51];
char text[51][51];
char c;
char strexp[30];
int style;
int value;
int brkptr=0;
int f[8][8]={{-1,1,-1,-1,0,-1,0,-1},{-1,2,2,2,0,2,0,2},{-1,2,2,2,0,2,0,2},{-1,2,-1,2,0,2,0,-1},{0,0,0,0,0,0,0,0},{-1,2,-1,2,0,2,0,-1},{0,0,0,0,0,0,0,0},{-1,2,2,2,0,2,0,2}};
//varibles
//main functions
void mvfwd();
void dobrkpt(char str[20]);
void dovalue1(char str[51]);
int dovalue2(char str[30]);
void error(int errtype,int line)
{
line++;
if(errtype==BOOLERR) printf("\nERROR: Boolean expression error at line %d.\n",line);
if(errtype==VARNAMETOOLONG) printf("\nERROR: Varible name too long at line %d.\n",line);
if(errtype==VARNOTFOUND) printf("\nERROR: Varible not found at line %d.\n",line);
if(errtype==SYNTAXERROR) printf("\nERROR: Syntax error at line %d.\n",line);
if(errtype==EXPERROR) printf("\nERROR: Experssion error at line %d.\n",line);
if(errtype==LEFTMISSING) printf("\nERROR: ( missing at line %d.\n",line);
if(errtype==RIGHTMISSING) printf("\nERROR: ) missing at line %d.\n",line);
if(errtype==LEFTMISSINGB) printf("\nERROR: { missing at line %d.\n",line);
if(errtype==RIGHTMISSINGB) printf("\nERROR: } missing at line %d.\n",line);
if(errtype==VARNAMESPACE) printf("\nERROR: Space not allowed in varible name at line %d.\n",line);
if(errtype==VARNAMEERR) printf("\nERROR: Varible name not avilable at line %d.\n",line);
exit(0);
}
void jumpover()
{
int ii,jj;
ii=0; jj=1;
while(1)
{
if(text[temp_line][temp_row]=='{') { ii++; jj=0; }
if(text[temp_line][temp_row]=='}') { ii--; jj=0; }
if((ii==0)&&(jj==0)) break;
mvfwd();
}
mvfwd();
text_line=temp_line;
text_row=temp_row;
}
//jump over {} of IF or WHILE
int ccltbool(char str[50])
{
int i,j,k,start,end,sgstart,sgend;
int leftnum=0,rightnum=0;
char left[10],right[10];
for(i=0;i<=strlen(str);i++)
if(str[i]=='(') break;
start=i+1;
if(i==strlen(str)) error(LEFTMISSING,temp_line);// '(' missing
for(i=strlen(str);i>=0;i--)
if(str[i]==')') break;
end=i-1;
if(i==0) error(RIGHTMISSING,temp_line);//')' missing
for(i=start;i<=end;i++)
if((str[i]=='>')||(str[i]=='<')||(str[i]=='=')||(str[i]=='!'))
break;
sgstart=i;
for(i=end;i>=start;i--)
if((str[i]=='>')||(str[i]=='<')||(str[i]=='='))
break;
sgend=i;
if(sgstart>sgend) error(BOOLERR,temp_line);
for(i=0;i<=5;i++)
{
left[i]=' ';
right[i]=' ';
}
left[5]='\x0';
right[5]='\x0';
left[0]='=';
for(i=start;i<sgstart;i++) left[i-start+1]=str[i];
left[i-start+1]=';';
left[i-start+2]='\x0';
right[0]='=';
for(i=sgend+1;i<=end;i++) right[i-sgend]=str[i];
right[i-sgend+1]=';';
right[i-sgend+2]='\x0';
//varibles
dovalue1(left);
leftnum=dovalue2(strexp);
dovalue1(right);
rightnum=dovalue2(strexp);
if(sgstart==sgend)
{
if(str[sgend]=='<')
{
if(leftnum<rightnum) return 1;
else return 0;
}
if(str[sgend]=='>')
{
if(leftnum>rightnum) return 1;
else return 0;
}
}
if(sgstart!=sgend)
{
if((str[sgstart]=='>')&&(str[sgend]=='='))
{
if(leftnum>=rightnum) return 1;
else return 0;
}
if((str[sgstart]=='<')&&(str[sgend]=='='))
{
if(leftnum<=rightnum) return 1;
else return 0;
}
if((str[sgstart]=='=')&&(str[sgend]=='='))
{
if(leftnum==rightnum) return 1;
else return 0;
}
if((str[sgstart]=='!')&&(str[sgend]=='='))
{
if(leftnum!=rightnum) return 1;
else return 0;
}
}
return 0;
}
//caculate boolean value
void doint(char str[50])
{
int i,j,k,ns=-1;
for(i=strlen(str);i>=0;i--)
if((str[i]==';')||(str[i]==','))
{
for(j=i-1;j>=0;j--)
if((str[j]==',')||(str[j]==' '))
break;
if(i-1-j-1>6) error(VARNAMETOOLONG,temp_line);
for(k=j+1;k<=i-1;k++)
{
ns++;
varible[varnum].name[ns]=str[k];
if(str[k]==' ') error(VARNAMESPACE,temp_line);
}
if((varible[varnum].name[0]=='i')&&(varible[varnum].name[1]=='f')&&(varible[varnum].name[2]=='\x0'))
error(VARNAMEERR,temp_line);
if((varible[varnum].name[0]=='s')&&(varible[varnum].name[1]=='c')&&(varible[varnum].name[2]=='a')&&(varible[varnum].name[3]=='n')&&(varible[varnum].name[4]=='f')&&(varible[varnum].name[5]=='\x0'))
error(VARNAMEERR,temp_line);
if((varible[varnum].name[0]=='w')&&(varible[varnum].name[1]=='h')&&(varible[varnum].name[2]=='i')&&(varible[varnum].name[3]=='l')&&(varible[varnum].name[4]=='e')&&(varible[varnum].name[5]=='\x0'))
error(VARNAMEERR,temp_line);
if((varible[varnum].name[0]=='i')&&(varible[varnum].name[1]=='n')&&(varible[varnum].name[2]=='t')&&(varible[varnum].name[3]=='\x0'))
error(VARNAMEERR,temp_line);
if((varible[varnum].name[0]=='p')&&(varible[varnum].name[1]=='r')&&(varible[varnum].name[2]=='i')&&(varible[varnum].name[3]=='n')&&(varible[varnum].name[4]=='t')&&(varible[varnum].name[5]=='f'))
error(VARNAMEERR,temp_line);
varible[varnum].val=0;
varnum++;
ns=-1;
}
}
//int
void readin(char strvar[6])
{
int ii,jj,bool=1;
for(ii=0;ii<=varnum-1;ii++)
{
bool=1;
for(jj=0;jj<=strlen(varible[ii].name)-1;jj++)
if(strvar[jj]!=varible[ii].name[jj])
{
bool=0;
break;
}
if(bool)
{
break;
}
}
if(bool==1) scanf("%d",&varible[ii].val);
if(bool==0) error(VARNOTFOUND,temp_line);
}
//varible read in
void doscanf(char str[50])
{
int i,j,k,end,now;
char sstr[6];
for(i=strlen(str);i>=0;i--)
if(str[i]==';') break;
end=i-1;
for(j=i;j>=0;j--)
if(str[j]=='(') break;
now=j+1;
for(i=now;i<=end;i++)
{
if((str[i]==',')||(str[i]==')'))
{
for(j=0;j<=5;j++) sstr[j]=' ';
sstr[5]='\x0';
for(j=now;j<=i-1;j++) sstr[j-now]=str[j];
readin(sstr);
now=i+1;
}
}
}
//scanf
void mvfwd()
{
temp_row++;
if(temp_row>strlen(text[temp_line]))
{
temp_line++;
temp_row=0;
}
}
//move forward
void doprintf(char str[50])
{
int i,j,start=0,end=0,now=0;
char pvar[6];
for(i=0;i<=strlen(str);i++)
if(str[i]=='(')
{
start=i+1; break;
}//find start
for(i=strlen(str);i>=0;i--)
if(str[i]==')')
{
end=i;
str[i]=',';
break;
}//find end
if(start==0) error(LEFTMISSING,temp_line);
if(end==0) error(RIGHTMISSING,temp_line);
now=start;
for(i=start;i<=end;i++)
if(str[i]==',')
{
if(str[now]=='"')
{
for(j=now+1;j<=i-2;j++)
{
if(str[j]!='\\')
{
printf("%c",str[j]);
}
if(str[j]=='\\') { printf("\n"); j++; }
}
now=i+1;
continue;
}
if(str[now]!='"')
{
for(j=0;j<=5;j++) pvar[j]=' ';
pvar[5]='\x0';
for(j=now;j<=i-1;j++) pvar[j-now]=str[j];
printf("%d",chkvar(pvar));
now=i+1;
}
}
}
//printf
void copy(int a,int b,int c,int d)
{
int i,j,k=-1;
for(i=0;i<=50;i++) part[i]=' ';
if(a==c)
{
for(i=b;i<=d;i++)
{
part[i-b]=text[a][i];
}
}
if(a<c)
{
for(j=b;j<=strlen(text[a]);j++)
if(text[a][j]!='\x0')
{
k++;
part[k]=text[a][j];
}
for(i=a+1;i<=c-1;i++)
for(j=0;j<=strlen(text[i]);j++)
if(text[i][j]!='\x0')
{
k++;
part[k]=text[i][j];
}
for(j=0;j<=d;j++)
if(text[c][j]!='\x0')
{
k++;
part[k]=text[c][j];
}
}
}
//copy from text[a][b] till text[c][d] into "part"
int chkvar(char chkstr[6])
{
int ii,jj,bool=0;
for(ii=0;ii<=varnum-1;ii++)
{
bool=1;
for(jj=0;jj<=strlen(varible[ii].name)-1;jj++)
if(chkstr[jj]!=varible[ii].name[jj])
{
bool=0;
break;
}
if(bool)
{
break;
}
}
if(bool==1) return varible[ii].val;
if(bool==0) error(VARNOTFOUND,temp_line);
}
//check value of varible
void dobrkpt(char str[51])
{
int ii,start=-1,end=-1;
for(ii=0;ii<=strlen(str);ii++)
{
if(str[ii]=='(') start=ii;
if(str[ii]==')') end=ii;
}
if(start==-1) error(LEFTMISSING,temp_line);
if(end==-1) error(RIGHTMISSING,temp_line);
for(ii=0;ii<=18;ii++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -