⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ver4.bak

📁 一个小型的C解释器
💻 BAK
📖 第 1 页 / 共 2 页
字号:
#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 + -