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

📄 wen.c

📁 这是编译原理里面用来判断输入的东西是是否是符合数学运算公式
💻 C
字号:
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <math.h>
char prog[80],token[8];
char ch;
int syn,p,m,n,k;
double sum;
int inte,sign,tmp;
char *rwtab[6]={"begin","if","then","while", "do","end"};
void e();
void t();
void f();
void scaner();
int isLetter(char);
int isDigit(char);
void error();


int isLetter(char c)
{
    if( (c>='a' && c<='z') || (c>='A' && c<='Z') ) return 1;
    else return 0;
}


int isDigit(char c)
{
    if(c>='0' && c<='9') return 1;
    else return 0;
}

void error()
{
    printf("\n It is error!\n");
    syn=0;
}

void e()
{  t();
     while (syn==13||syn==14)
        {   
         scaner();
     t();
        }    
}
void t( )
{  f();
     while(syn==15||syn==16)
        {   
           scaner();
     f();
        }
}
void f()
{  if (syn==10||syn==11||syn==12||syn==29)
               scaner();
    else if (syn==27)
    {
            scaner();
      e();
      if (syn==28)
              scaner();
      else k=0;
    }
    else    k=0;
}

void scaner( )
{
    double s=0;                                 /*s为小数点后的数*/
    int n,i=0;
    char ch1;                                   /*i为小数点后位数*/
    for ( n=0; n<8; n++ )
        token[n]='\0';                          /*置空 */
    ch=prog[p++];
    while (ch==' ')  ch=prog[p++] ;             /*跳过空格*/

    if(ch=='+'||ch=='-')
    {
     if(ch=='+') tmp=1;
        else  tmp=-1;
     if(syn==10||syn==11||syn==12||syn==29||syn==28)
     { if(ch=='+'){syn=13; token[0]=ch;}
        else   {syn=14; token[0]=ch; }
      }
     else
     { ch=prog[p++];/*读入下一个字符*/
       while (ch==' ')  ch=prog[p++] ;/*忽略空格*/
       if(isDigit(ch))
       {
       sign=tmp;
       p--;
       scaner();
       sign=1;
       }
       else
       {
       p--;
       if(tmp==1){syn=13; token[0]='+';}
        else   {syn=14; token[0]='-'; }}
      }
    }


    else if(isLetter(ch))
    {
        m=0;
        while(isLetter(ch)||isDigit(ch))
        {
            token[m++]=ch;
            ch=prog[p++];
        }
        token[m++]='\0';
        p--;
        for (n=0; n<6; n++)
        {
            if( strcmp(token, rwtab[n])==0)     /*判断是否是关键字*/
            {
                syn=n+1;
                break ;
            }
            else syn=10;
        }
    } 

   else if( isDigit(ch) ) {
   {
       while (isDigit(ch))
       {
          inte=inte*10+ch-'0';                  /*将字符串转化为常数*/
          ch=prog[p++];
      }
      p--;
      ch=prog[p++];

       if(ch=='.')
     {

      {
          ch1=ch;
          sum=inte;
          ch=prog[p++];
          if(!isDigit(ch))
          {
              error();
              return;
          }
          while(isDigit(ch))
          {
              i++;
              s=s*10+ch-'0';
              ch=prog[p++]; 
          }
          p--;
          sum=sum+s/pow(10,i);
           syn=11;
          ch=prog[p++];
      }
      if(ch=='e'||ch=='E')                               /*科学计数法 */
      {
          s=sum;                                /*保存e前面的数*/
          sum=0;
          ch=prog[p++];                         /*读e后面的字符 */
          if(!isDigit(ch)&&ch!='-')
          {
              error();
              return;
          }
          if(ch=='-')
          {
              i=-12;
              ch=prog[p++];
              if(!isDigit(ch)) 
              {
                  error();
                  return;
              }
          }
          while (isDigit(ch))                   /*读入e后面的数字字符并转化为常数*/
          {
              sum=sum*10+ch-'0';
              ch=prog[p++];
          }
          
          if(i==-12) sum=s / pow(10,sum);       /*计算科学计数法的结果 */
          else sum=s * pow(10,sum);
          syn=12;
      }
          sum=sum*sign;
    }
   }
   if(ch=='e'||ch=='E'){                               /*科学计数法 */
      {   sum=inte;
          s=sum;                                /*保存e前面的数*/
          sum=0;
          ch=prog[p++];                         /*读e后面的字符 */
          if(!isDigit(ch)&&ch!='-')
          {
              error();
              return;
          }
          if(ch=='-')
          {
              i=-1;
              ch=prog[p++];
              if(!isDigit(ch)) 
              {
                  error();
                  return;
              }
          }
          while (isDigit(ch))                   /*读入e后面的数字字符并转化为常数*/
          {
              sum=sum*10+ch-'0';
              ch=prog[p++];
          }
          p--;
          if(i==-1) sum=s / pow(10,sum);       /*计算科学计数法的结果 */
          else sum=s * pow(10,sum);
          syn=12;
      }
          sum=sum*sign;
    }
    else
      {
          p--;
          inte=inte*sign;
          syn=29;
          if(ch1=='.')syn=11;
      }
   }

  else
      switch(ch)
   {
    case '*': syn=15; token[0]=ch; break;       /**15*/
    case '/': syn=16; token[0]=ch; break;       /*/1*/
    case ':':
        m=0;
        token[m++]=ch;
        ch=prog[p++];
        if (ch=='=')                            /*:= 18*/
        {
            syn=18;
            token[m++]=ch;
        }
        else                                    /*:17*/
        {
            syn=17;
            p--;
        }
        break;
     case '<':
          m=0; 
        token[m++]=ch;
        ch=prog[p++];
        if (ch=='>')                            /*<>21*/
        {
            syn=21;
            token[m++]=ch;
        }
        else if (ch=='=')                       /*<=22*/
        {
            syn=22;
            token[m++]=ch;
        }
        else {                                  /*<20*/
            syn=20;
            p--;
        }
        break;
     case '>':
        m=0;
        token[m++]=ch;
        ch=prog[p++];
        if (ch=='=')                            /*>=24*/
        {
            syn=24;
            token[m++]=ch;
        }
        else                                    /*>23*/
        {
            syn=23;
            p--;
        }
        break;
    case '=': syn=25; token[0]=ch; break;       /*=25*/
    case ';': syn=26; token[0]=ch; break;       /*;26*/
    case '(': syn=27; token[0]=ch; break;       /*(27*/
    case ')': syn=28; token[0]=ch; break;       /*)28*/
    case '#': syn=0;  token[0]=ch; break;       /*#0*/
    default: syn= -1;                           /*error*/
  }
}

void main( )
{  p=0;
    printf("\r\n please input the source program:\r\n");
     do {  ch=getchar();
        prog[p++]=ch;
    } while (ch!='#');
      p=0;  k=1;
      scaner();
      if (syn==10||syn==11||syn==12||syn==29||syn==27) e();
      else  k=0;
      if ((ch=='#') && (k==1))
        printf("\r\nsuccess\r\n");
     else   printf("\r\nerror\r\n");
     getch();
   }

⌨️ 快捷键说明

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