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

📄 final.c

📁 c写的一个c小段程序编译程序
💻 C
📖 第 1 页 / 共 2 页
字号:

char * gettoken( int Method,char * p[] )
{static int c = 1;
switch(Method)
  {
   case 1:
        return p[c++];

  case -1:
        return p[--c];
   }
}

int lookupid( char * p, char * q[], int r )
{
  int c, w;
  c = 0;
  for ( w = 1; w <= r; w++ )
  {
    if ( strcmp( p, q[w] ) == 0 )
      c = 1;

  }
  return c;
}


char * lookupkey( char * p, char * q[16] )
{
  int m;
  char * r;
  r = "0";
  for ( m = 0; m <= 15; m++ )
  {
    if ( strcmp( p, q[m] ) == 0 ) r = q[m];
  }


  return ( r );
}


void output( int i, char * p ) /* 输出识别后的2元组表示 */
{
  FILE * fp1;
  char showname[20];
  fp1 = fopen( "b.c", "a" );

  switch ( i )
  {
    case 1:
      strcpy( showname, "id" );
    break;
    case 2:
      strcpy( showname, "int" );
    break;
    case 3:
      strcpy( showname, "key" );
    break;
    case 4:
      strcpy( showname, "less than" );
    break;
    case 5:
      strcpy( showname, "less or equal" );
    break;
    case 6:
      strcpy( showname, "greater or equal" );
    break;
    case 7:
      strcpy( showname, "greaterthan" );
    break;
    case 8:
      strcpy( showname, "equal" );
    break;
    case 9:
      strcpy( showname, "leftbrackt" );
    break;
    case 10:
      strcpy( showname, "rightbrackt" );
    break;
    case 11:
      strcpy( showname, "leftBbrackt" );
    break;
    case 12:
      strcpy( showname, "rightBbrackt" );
    break;
    case 13:
      strcpy( showname, "add" );
    break;
    case 14:
      strcpy( showname, "subtract" );
    break;
    case 15:
      strcpy( showname, "multiply" );
    break;
    case 16:
      strcpy( showname, "divide" );
    break;
    case 17:
      strcpy( showname, "semicolon" );
    break;
    case 18:
      strcpy( showname, "assign" );
    break;
  }

  fprintf( fp1, "<%s,%s>\n", showname, p );
  fclose( fp1 );
}







void syntaxanalyse(char *t[],int r, char * p[] )
{

  if ( strcmp( gettoken(1, p ), "main" ) == 0)
      {
      ;
      }
  else
    {
    printf("spelling mistake of 'main'OR 'main' missing!\n ");
    return;
    }
     if( strcmp( gettoken(1, p ), "(" ) == 0 )
     {
     ;
     }
     else
      {
       printf("'(' missing!\n");
       return;
       }
         if(strcmp( gettoken(1, p ), ")" ) != 0)
          {
           printf("')' missing!\n");
           return;
           }
         else
          { ;
          }
           if (strcmp( gettoken(1, p ), "{" ) != 0 )
             {
              printf("'{' missing!\n");
              return;
              }
           else
             { ;
             }

          procedure( t,r,p );

    if ( strcmp( gettoken( 1,p ), "}" ) == 0 )
      printf( "Syntax test passed,This is a legal program.\n" );
    else
      {
      printf( "'}' missing!\n" );
      return;
      }
}



void procedure( char *t[],int r,char * p[] )
{
  definition( t,r,p );
  assignment( t,r,p );
  condition( t,r,p );
}






void definition( char *t[],int r,char * p[] )
{ char *q;
  if ( strcmp( gettoken(1, p ), "int" ) == 0 )
    {  q=gettoken(1, p );
    if ( idcheck( t,r,q ) )
    { ;
    }
    else
      printf("Variable not defined!\n");
    if ( strcmp( gettoken(1, p ), ";" ) == 0 )
        definition( t,r,p );
    else
        printf( "';' missing!\n" );
    }
    

}






void assignment( char *t[],int r,char * p[] )
{  char *q;
   q=gettoken(-1,p);

  if ( idcheck( t,r,q ) )
  {  gettoken(1,p);
       
    if ( strcmp( gettoken(1, p ), "=" ) == 0 )
    {
      if ( numbercheck( p ) )
      {
        if ( strcmp( gettoken(1, p ), ";" ) == 0 )
          {
          gettoken(1,p);
          assignment( t,r,p );
          }
        else
          printf( "';' missing!\n" );
      }
      else
        printf( "Syntax error!\n" );
    }
    else
      { ;
      }

  }

  else
    { ;
    }

}




void condition( char *t[],int r,char * p[] )
{ char *q;

    if ( strcmp( gettoken(1, p ), "if" ) == 0 && strcmp( gettoken( 1,p ), "(" ) == 0 )
    { ;
    }
    else
    printf("Not a condition statments!\n");

    q=gettoken(1,p);
    if ( idcheck( t,r,q ) )
    { ;
    }
    else
      printf("Variable not defined!\n");

   if ( opcheck( p ) )
   { ;
   }
   else
     printf("Syntax error!\n");

    q=gettoken(1,p);
   if ( idcheck( t,r,q ) )
   { ;
   }
   else
     printf("Variable not defined!\n");

   if ( strcmp( gettoken( 1,p ), ")" ) == 0 )
   { ;
   }
   else
     printf("')' missing!\n");

   q=gettoken(1,p);
   if ( idcheck( t,r,q ) )
   { ;
   }
   else
     printf("Variable not defined!\n");

   if ( strcmp( gettoken( 1,p ), "=" ) == 0 )
   { ;
   }
   else
     printf("Syntax error!\n");

   q=gettoken(1,p);
   if ( idcheck( t,r,q ) )
   { ;
   }
   else
     printf("Variable not defined!\n");

   if ( opcheck( p ) )
   { ;
   }
   else
     printf("Syntax error!\n");

   q=gettoken(1,p);
   if ( idcheck( t,r,q ) )
   { ;
   }
   else
     printf("Variable not defined!\n");

   if ( strcmp( gettoken( 1,p ), ";" ) == 0 )
   { ;
   }
   else
     printf("';' missing!\n");
}


int idcheck( char * t[],int r, char * q )
{
  int i, c = 0;

 for ( i = 1; i <= r; i++ )
  {
    if ( strcmp( q, t[i] ) == 0 )
      c = 1;
  }
  return c;
}



int opcheck( char * p[] )
{
  int c = 0;
  char *q;
  q = gettoken( 1,p );
  if ( strcmp( q, "+" ) == 0 || strcmp( q, "-" ) == 0 || strcmp( q, "*" ) == 0 || strcmp( q, "/" ) == 0
     ||strcmp( q, ">")==0 ||strcmp( q, ">=")==0||strcmp( q, "<")==0||strcmp( q, "<=")==0||strcmp( q, "==")==0)
    c = 1;
  return c;
}



int numbercheck( char * p[] )
{
  int c = 0;
  char *q;
  q = gettoken( 1,p );
  if ( strcmp( q, "0" ) == 0 || strcmp( q, "1" ) == 0 || strcmp( q, "2" ) == 0 || strcmp( q, "3" ) == 0
       || strcmp( q, "4" ) == 0 || strcmp( q, "9" ) == 0 || strcmp( q, "8" ) == 0 || strcmp( q, "7" ) == 0
       || strcmp( q, "6" ) == 0 || strcmp( q, "5" ) == 0 )
         c = 1;
  return c;
}



int switchnumber(char *p[],int i)
{
   if(strcmp(p[i],"0")==0)return 0;
   else if(strcmp(p[i],"1")==0)return 1;
   else if(strcmp(p[i],"2")==0)return 2;
   else if(strcmp(p[i],"3")==0)return 3;
   else if(strcmp(p[i],"4")==0)return 4;
   else if(strcmp(p[i],"5")==0)return 5;
   else if(strcmp(p[i],"6")==0)return 6;
   else if(strcmp(p[i],"7")==0)return 7;
   else if(strcmp(p[i],"8")==0)return 8;
   else if(strcmp(p[i],"9")==0)return 9;
}


int calculate(int a, int b,char *p[])
{
int c;
if(strcmp(p[31],"+")==0)return (a+b);
if(strcmp(p[31],"-")==0)return (a-b);
if(strcmp(p[31],"*")==0)return (a*b);
if(strcmp(p[31],"/")==0)return (a/b);

}

⌨️ 快捷键说明

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