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

📄 liming.cpp

📁 编译原理small语言的编译程序
💻 CPP
字号:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct keeper{char *a;
              int b;}D1[14],D2[14]={{"dim",1},{"if",2},{"do",3},{"stop",4},{"end",5},{"i",6},{"1",7},
                                    {"=",8},{"+",9},{"*",10},{"**",11},{",",12},{"(",13},{")",14}};

void read(FILE ** p)
{ int i;
  if((*p=fopen("data.c","w"))==NULL)
  { printf("Can't open %s\n","data.c");
    exit(-1);
  }
  for(i=0;i<14;i++)
    fprintf(*p,"%s %d",D2[i].a,D2[i].b);
  fclose(*p);
}

void write(FILE * p)
{ int i;
  for(i=0;i<=14;i++)
    fscanf(p,"%s%d",D1[i].a,D1[i].b);
}

int compare(char *a)
{ int i;
  for(i=0;i<14||strcmp(a,D1[i].a);i++);
  if(i==14)
    return 0;
  else
    return D1[i].b;
}


int if_num(char *a)
{ int i;
  for(i=0;a[i]!='\0';i++)
    if(a[i]<'0'||a[i]>'9')
      break;
  if(a[i]=='\0')
    return 6;
  else
    return 0;
}

int if_word(char *a)
{ if('a'<=a[0]&&a[0]<='z'||'A'<=a[0]&&a[0]<='Z')
    return 5;
  else
    return 0;
}

void scanner(FILE *p)
{ char c;
  int flag=0,i=0,j;
  char memo[20]="";
  c=fgetc(p);
  while(!feof(p))
  { if(c!=' '&&c!='+'&&c!='*'&&c!='='&&c!=','&&c!='('&&c!=')')
    { memo[i]=c;
      i++;
      flag=1;
      c=fgetc(p);
    }
    else
    { if(flag==1)
      { j=compare(memo);
        if(j==0)
          j=if_num(memo);
        if(j==0)
          j=if_word(memo);
        for(i=0;memo[i]!='\0';i++)
        { putchar(memo[i]);
          memo[i]='\0';
        }
        if(j==0)
          printf("\tError.\n");
        else
          printf("\t%d\n",j);
       
      } flag=0;

      switch(c)
      {    case' ': break;
	       case'+': printf("+\t%d\n",compare("+"));break;
           case'=': printf("=\t%d\n",compare("="));break;
           case'(': printf("(\t%d\n",compare("("));break;
           case')': printf(")\t%d\n",compare(")"));break;
           case',': printf(",\t%d\n",compare(","));break;
           case'*': if(fgetc(p)=='*')
                      printf("**\t%d\n",compare("**"));
                    else
                    { printf("*\t%d\n",compare("*"));
                      memo[0]=c;
                      i=1;
                      flag=1;
                    }
                    break;
	 }
      c=fgetc(p);
      }
    }
}

void main()
{ FILE *p;
  FILE *p1;
  read(&p);
  write(p);
  if((p1=fopen("aa.txt","r"))==NULL)
    printf("Can't open the file program.");
  else
    scanner(p1); 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -