简易四则运算编译器(自己的创作 C语言)

来源:互联网 发布:土木工程三维建模软件 编辑:程序博客网 时间:2024/05/19 16:35

源程序

#include<stdio.h>

#include<math.h>

typedef struct word{ 

       double v;

       int c;

       }word;

word B[10];

double result[10];

int s2=0;

void in(int c)

{   if(B[c].c==1)

       {result[s2]=B[c].v;

       s2++;}

       else if(B[c].c<6){

              result[s2]=B[c].c;

              s2++;

       }

}

void compute()

{   int s;

       double m1,m2;

       s2--;m2=result[s2];

       s2--;s=(int)result[s2];

       s2--;m1=result[s2];

       switch(s){

       case 2:result[s2]=m1+m2;s2++;break;

       case 3:result[s2]=m1-m2;s2++;break;

       case 4:result[s2]=m1*m2;s2++;break;

       case 5:result[s2]=m1/m2;s2++;break;

       }

}

int cifafenxi(int &s);

main()

{   int i,j,k,m,n;

       int a,b,c,s,ci,s1;

       int F[20],G[20];

       typedef struct shi{

              int x;

              int y;

              char z;

       }shi;

       shi D[11];

       int C[16][14]={{0,5,0,0,0,0,4,0,0,1,2,3,0,0},

              {0,0,7,8,0,0,0,0,40,0,0,0,6,0},

              {0,0,22,22,10,11,0,22,22,0,0,0,0,9},

              {0,0,24,24,24,24,0,24,24,0,0,0,0,0},

              {0,5,0,0,0,0,4,0,0,12,2,3,0,0},

              {0,0,26,26,26,26,0,26,26,0,0,0,0,0},

              {0,5,0,0,0,0,4,0,0,0,13,3,0,0},

              {0,27,0,0,0,0,27,0,0,0,0,0,0,0},

              {0,28,0,0,0,0,28,0,0,0,0,0,0,0},

              {0,5,0,0,0,0,4,0,0,0,0,14,0,0},

              {0,29,0,0,0,0,29,0,0,0,0,0,0,0},

              {0,30,0,0,0,0,30,0,0,0,0,0,0,0},

              {0,0,7,8,0,0,0,15,0,0,0,0,6,0},

              {0,0,21,21,10,11,0,21,21,0,0,0,0,9},

              {0,0,23,23,23,23,0,23,23,0,0,0,0,0},

              {0,0,25,25,25,25,0,25,25,0,0,0,0,0}};

       j=1;m=9;

       for(i=0;i<5;i++)

       {  for(k=0;k<2;k++)

              { D[j].x=m;

          j++;}

              m++;};

       for(i=1;i<=10;i++)

              D[i].y=1;

       D[1].y=D[3].y=D[5].y=3;

       D[3].z=D[4].z='T';

       D[1].z=D[2].z='E';

       D[5].z=D[6].z='F';

       D[7].z=D[8].z='A';

       D[9].z=D[10].z='M';

       ci=cifafenxi(s1);

       if(!ci){printf("词法错误。/n");return(0);}

    B[s1].c=8;

       a=b=c=0;

       F[0]=0;G[0]=8;

       printf("状态栈");printf("/t");

       printf("符号栈");printf("/t");

       printf("余留串");printf("/t");

       printf("动作");printf("/t");

       printf("下一状态/n");

       for(i=0;i<=a;i++)

              printf("%d",F[i]);

       printf("/t");printf("#");

       for(i=1;i<=b;i++)

              printf("%d",G[i]);

       printf("/t");

    for(i=c;B[i].c!=8;i++)

              printf("%d",B[i].c);

       printf("#");printf("/t");

       while(C[F[a]][B[c].c]!=40)

       {   if(a==b)

       {   m=C[F[a]][B[c].c];

              if(m<20)

              {   a++;b++;

                     F[a]=m;

                     G[b]=B[c].c;

                     c++;

                     in(c-1);

                     if(m==0){

                            printf("错误语法。/n");return(0);}

              }

              else {s=n=m-20;

                     a=a-D[n].y;

                     b=b-D[n].y+1;

                     G[b]=D[n].x;

                     if(n==1||n==3)

                            compute();}

       }

    if(a!=b){n=C[F[a]][G[b]];

              a++;

              F[a]=n;}

       if(m<20){printf("S%d",m);

                  printf("/t");

                     printf("%d/n",m);

       }

       else {printf("R%d",s);

              printf("/t");

              printf("Goto=%d/n",F[a]);

       }

       for(i=0;i<=a;i++)

              printf("%d",F[i]);

printf("/t");  printf("#");

       for(i=1;i<=b;i++){

              if(G[i]>8)

                     switch(G[i]){

                     case 9: printf("%c",D[1].z);break;

                     case 10:printf("%c",D[3].z);break;

                  case 11:printf("%c",D[5].z);break;

                     case 12:printf("%c",D[7].z);break;

                     case 13:printf("%c",D[9].z);break;}

 

              else printf("%d",G[i]);}

printf("/t");

       for(i=c;B[i].c!=8;i++)

              printf("%d",B[i].c);

              printf("#");

printf("/t");

       }

      

    if(C[F[a]][8]==40){

              printf("Acc 正确语法!/n");

              printf("result=%f/n",result[0]);}

       return(0);

}

 

int cifafenxi(int &s)

{

       int i,p,e,n,j,r=0;

       char A[20];

       char a;

    double sum=0,sum1=0,sum2=0,sum3,m=0,x=0;

       i=p=e=s=n=j=0;

      

    printf("请输入无符号数四则运算表达式:/n");

       scanf("%s",&A);

       printf("词法分析结果:/n");

       a=A[0];

       while(A[i]!='/0')

       {  

              switch(A[i]){

              case '+':printf("%c 类型码为 2/n",A[i]);B[s].c=2;

                     a=A[i+1];

                      printf("No value!  class=%d/n",B[s].c);

                     s++;break;

           case '-':printf("%c 类型码为 3/n",A[i]);B[s].c=3;

                     a=A[i+1];

                      printf("No value!  class=%d/n",B[s].c);

                     s++;break;

              case '*':printf("%c 类型码为 4/n",A[i]);B[s].c=4;

                     a=A[i+1];

                  printf("No value!  class=%d/n",B[s].c);

                     s++;break;

              case '/':printf("%c 类型码为 5/n",A[i]);B[s].c=5;

                     a=A[i+1];

           printf("No value!  class=%d/n",B[s].c);

                     s++;break;

              case '(':printf("%c 类型码为 6/n",A[i]);B[s].c=6;

                     a=A[i+1];

             printf("No value!  class=%d/n",B[s].c);

                     s++;break;

              case ')':printf("%c 类型码为 7/n",A[i]);B[s].c=7;

                  a=A[i+1];

            printf("No value!  class=%d/n",B[s].c);

                     s++;break;

           case '.':printf("%c",A[i]);p++;

                     if(A[i+1]>='0'&&A[i+1]<='9'||A[i+1]=='E')

                            break;

                     else if(a=='.'){

                             printf("错误的单词/n");s++;a=A[i+1];p--;r=1;}

                             else  {printf(" 类型码为 1/n");B[s].v=sum1,B[s].c=1;

                                 printf("value=%f  class=%d/n",B[s].v,B[s].c);s++;

                             sum1=0;a=A[i+1];p--;}

                             break;

              case 'E':printf("%c",A[i]);

                          e++;

                     switch(A[i+1]){

                     case 'E':printf(" 错误的单词/n");r=1;

                            a=A[i+1];e--;break;

                     case '-':

                     case '+':i++;

                            printf("%c",A[i]);if(A[i]=='-')j++;

                    

                     default:if(A[i+1]>='0'&&A[i+1]<='9')

                                          break;

                     else if((A[i+1]>'9'||A[i+1]<'0')||A[i+1]=='/0')      

                       {printf(" 错误的单词/n");s++;a=A[i+1];e=p=0;r=1;}

                     }

                     break;

        default:

                     printf("%c",A[i]);

                     if((A[i]>'9'||A[i]<'0')&&A[i]!='.'&&A[i]!='E')

                     if((A[i+1]>'9'||A[i+1]<'0')&&A[i+1]!='.'&&A[i+1]!='E'&&A[i+1]!='/0')

                            break;

                     else {printf(" 错误的单词/n");s++;

                     r=1;a=A[i+1];break;}

                    

                     if(A[i]>='0'&&A[i]<='9'){

                            if(e!=1){

                            if(p==0) sum1=sum1*10+A[i]-48;

                            else {n++;x=x*10+(A[i]-48); }}

                            else m=m*10+A[i]-48;

                     }

 

                     switch(A[i+1]){

                     case '.':if(p!=0)goto l1;

                     case 'E':if(e==0) break;

            l1:default:if(A[i+1]>='0'&&A[i+1]<='9')

                                          break;

                            else if(a=='E'){printf(" 错误的单词/n");e=p=0;

                            r=1;s++;a=A[i+1];}

                            else{printf(" 类型码为 1/n");

                            if(j==1)sum3=pow(10,-m);

                            else sum3=pow(10,m);

                            sum2=x/pow(10,n);

                            sum=(sum1+sum2)*sum3;

                            B[s].v=sum;B[s].c=1;

                                 printf("value=%f  class=%d/n",B[s].v,B[s].c);s++;

                               x=m=sum1=sum=sum2=0;j=e=p=n=0;a=A[i+1];}

                     }

              }i++;

       }

       if(r)

       return 0;

       else return 1;

}

正确的输入及结果:

请输入无符号数四则运算表达式:

1.2E+2-100

词法分析结果:

1.2E+2 类型码为 1

value=120.000000  class=1

- 类型码为 3

No value!  class=3

100 类型码为 1

value=100.000000  class=1

状态栈  符号栈  余留串  动作    下一状态

0       #       131#    S5      5

05      #1      31#     R6      Goto=3

03      #F      31#     R4      Goto=2

02      #T      31#     R2      Goto=1

01      #E      31#     S8      8

018     #E3     1#      R8      Goto=6

016     #EA     1#      S5      5

0165    #EA1    #       R6      Goto=3

0163    #EAF    #       R4      Goto=13

01613   #EAT    #       R1      Goto=1

01      #E      #       Acc 正确语法!

result=20.000000

Press any key to continue

 

语法错误的输入及结果:

请输入无符号数四则运算表达式:

12++

词法分析结果:

12 类型码为 1

value=12.000000  class=1

+ 类型码为 2

No value!  class=2

+ 类型码为 2

No value!  class=2

状态栈  符号栈  余留串  动作    下一状态

0       #       122#    S5      5

05      #1      22#     R6      Goto=3

03      #F      22#     R4      Goto=2

02      #T      22#     R2      Goto=1

01      #E      22#     S7      7

017     #E2     2#      错误语法。

Press any key to continue

 

词法错误的输入及结果:

请输入无符号数四则运算表达式:

1.2Ea+.

词法分析结果:

1.2E 错误的单词

a+ 类型码为 2

No value!  class=2

.错误的单词

词法错误。

Press any key to continue

 

原创粉丝点击