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

📄 bool完美版.c

📁 布尔语义分析
💻 C
字号:
struct key                                 /*关键字,运算符,界限符*/
{char str[8];
 int i;
 int j;
};
struct key a[36]={{{'i','n','t','\0'},0,1},
	  {{'c','h','a','r','\0'},1,1},
	  {{'f','l','o','a','t','\0'},2,1},
	  {{'b','r','e','a','k','\0'},3,1},
	  {{'c','a','s','e','\0'},4,1},
	  {{'d','o','\0'},5,1},
	  {{'e','l','s','e','\0'},6,1},
	  {{'f','o','r','\0'},7,1},
	  {{'i','f','\0'},8,1},
	  {{'s','w','i','t','c','h','\0'},9,1},
	  {{'r','e','t','u','r','n','\0'},10,1},
	  {{'s','t','r','u','c','t','\0'},11,1},
	  {{'m','a','i','n','\0'},12,1},
	  {{'w','h','i','l','e','\0'},13,1},
	  {{'d','o','u','b','l','e','\0'},14,1},
	  {{'v','o','i','d','\0'},15,1},
          {{'-','\0'},16,2},
	  {{'*','\0'},17,2},
	  {{'+','\0'},18,2},
	  {{'/','\0'},19,2},	  
	  {{'&','\0'},20,2},
	  {{'|','\0'},21,2},
          {{'!','\0'},22,2},        
          {{'<','\0'},23,2},
	  {{'>','\0'},24,2},	  
	  {{'<','=','\0'},25,2},
	  {{'>','=','\0'},26,2},
	  {{'=','=','\0'},27,2},
	  {{'!','=','\0'},28,2},          
	  {{'=','\0'},29,2},
	  {{',','\0'},30,2},	
	  {{';','\0'},31,3},
	  {{'(','\0'},32,3},
	  {{')','\0'},33,3},
	  {{'{','\0'},34,3},
	  {{'}','\0'},35,3}
       };
struct ID
{char str[10];                              /*标识符长度不能超过10*/
 int i;
};                                          /*用来存储标识符*/
struct data                                 /*无符号数*/
{char str[10];
 int i;
};
struct result
{int i;                                     /*1-关键字,2-运算符,3-界线符,4-标识符,5-常数*/
 int j;                                     /*在相应的数组中的下标*/
};
struct ID b[50];
struct data c[50];
struct result d[100];
int m,n;
char word[10];
int lengthb=0;
int lengthc=0;
int lengthd=0;
int IsIna()
{int i,j;
 for(i=0;i<36;i++)
    {j=strcmp(a[i].str,word);               /*word 是读取的单词,在main中定义*/
     if(j==0) return i;
    }
 return -1;
}
int IsInb()
{int i,j;
 for(i=0;i<lengthb;i++)
    {j=strcmp(b[i].str,word);               /*lengthb 是b[i]的长度*/
     if(j==0) return i;
    }
 return -1;
}
int IsInc()
{int i,j;
 for(i=0;i<lengthc;i++)
    {j=strcmp(c[i].str,word);
     if(j==0) return i;
    }
 return -1;
}
void InsertID()
{strcpy(b[lengthb].str,word);
 b[lengthb].i=lengthb;
 lengthb++;
}
void InsertData()
{strcpy(c[lengthc].str,word);
 c[lengthc].i=lengthc;
 lengthc++;
}
void InsertResult()
{d[lengthd].i=m;
 d[lengthd].j=n;
 lengthd++;
}
void Initword()
{int i;
 for(i=0;i<10;i++)
    word[i]='\0';
}
struct tempcode
   {int opplace;
    int class1;int place1;
    int class2;int place2;
    int class3;int place3;};
struct tempcode tempcode[20];
int ptempcode=0;
struct LR
{int action;
 int jump;
};
 struct LR lr[14][9]={{{0,0},{0,0},{1,2},{1,3},{0,0},{1,4},{0,0},{0,0},{4,1}},
                      {{1,5},{1,6},{0,0},{0,0},{0,0},{0,0},{0,0},{3,0},{0,0}},
                      {{0,0},{0,0},{1,2},{1,3},{0,0},{1,4},{0,0},{0,0},{4,7}},
                      {{0,0},{0,0},{1,2},{1,3},{0,0},{1,4},{0,0},{0,0},{4,8}},
                      {{2,6},{2,6},{0,0},{0,0},{2,6},{0,0},{1,9},{2,6},{0,0}},
                      {{0,0},{0,0},{1,2},{1,3},{0,0},{1,4},{0,0},{0,0},{4,10}},
                      {{0,0},{0,0},{1,2},{1,3},{0,0},{1,4},{0,0},{0,0},{4,11}},
                      {{2,3},{2,3},{0,0},{0,0},{2,3},{0,0},{0,0},{2,3},{0,0}},
                      {{1,5},{1,6},{0,0},{0,0},{1,12},{0,0},{0,0},{0,0},{0,0}},
                      {{0,0},{0,0},{0,0},{0,0},{0,0},{1,13},{0,0},{0,0},{0,0}},
                      {{2,1},{1,6},{0,0},{0,0},{2,1},{0,0},{0,0},{2,1},{0,0}},
                      {{2,2},{2,2},{0,0},{0,0},{2,2},{0,0},{0,0},{2,2},{0,0}},
                      {{2,4},{2,4},{0,0},{0,0},{2,4},{0,0},{0,0},{2,4},{0,0}},
                      {{2,5},{2,5},{0,0},{0,0},{2,5},{0,0},{0,0},{2,5},{0,0}}};
int stack1[20];
int pstack1;
struct stack2
{int class;      /*6-存储于数组T中,0-空,100-goto,-1 = 0,-2 = 1*/
 int place;
};
struct stack2 stack2[20];
int pstack2;
struct expression
   {int col;
    int class;
    int place;};
struct expression expression[50];
int pexpression,lengthe;
int lengthT=1;
int getrightlength(int x)
{if(x==3) return 2;
 else if(x==6) return 1;
 else return 3;
}
void regress(int x)
{switch(x)
   {case 1:
           tempcode[ptempcode].opplace=21;
           tempcode[ptempcode].class1=stack2[pstack2-3].class;
           tempcode[ptempcode].place1=stack2[pstack2-3].place;
           tempcode[ptempcode].class2=stack2[pstack2-1].class; 
           tempcode[ptempcode].place2=stack2[pstack2-1].place; 
           tempcode[ptempcode].class3=6;
           tempcode[ptempcode].place3=lengthT;           
           ptempcode++;
           pstack2=pstack2-2;
           stack2[pstack2-1].class=6;
           stack2[pstack2-1].place=lengthT;
           lengthT++;
           break;
    case 2:
           tempcode[ptempcode].opplace=20;
           tempcode[ptempcode].class1=stack2[pstack2-3].class;
           tempcode[ptempcode].place1=stack2[pstack2-3].place;
           tempcode[ptempcode].class2=stack2[pstack2-1].class; 
           tempcode[ptempcode].place2=stack2[pstack2-1].place; 
           tempcode[ptempcode].class3=6;
           tempcode[ptempcode].place3=lengthT;           
           ptempcode++;
           pstack2=pstack2-2;
           stack2[pstack2-1].class=6;
           stack2[pstack2-1].place=lengthT;
           lengthT++;
           break;
    case 3:
           tempcode[ptempcode].opplace=22;
           tempcode[ptempcode].class1=stack2[pstack2-1].class;
           tempcode[ptempcode].place1=stack2[pstack2-1].place;
           tempcode[ptempcode].class2=0;
           tempcode[ptempcode].place2=0;
           tempcode[ptempcode].class3=6;
           tempcode[ptempcode].place3=lengthT;
           ptempcode++;
           pstack2--;
           stack2[pstack2-1].class=6;
           stack2[pstack2-1].place=lengthT;
           lengthT++;
           break;
    case 4:
           stack2[pstack2-3]=stack2[pstack2-2];
           pstack2=pstack2-2;
           break;
    case 5:
           tempcode[ptempcode].opplace=stack2[pstack2-2].place;
           tempcode[ptempcode].class1=stack2[pstack2-3].class;
           tempcode[ptempcode].place1=stack2[pstack2-3].place;
           tempcode[ptempcode].class2=stack2[pstack2-1].class;
           tempcode[ptempcode].place2=stack2[pstack2-1].place;
           tempcode[ptempcode].class3=100;
           tempcode[ptempcode].place3=ptempcode+3;
           ptempcode++;
           tempcode[ptempcode].opplace=29;
           tempcode[ptempcode].class1=-1;
           tempcode[ptempcode].place1=0;
           tempcode[ptempcode].class2=0;
           tempcode[ptempcode].place2=0;
           tempcode[ptempcode].class3=6;
	   tempcode[ptempcode].place3=lengthT;
           ptempcode++;
           tempcode[ptempcode].opplace=100;        /*100-goto*/
           tempcode[ptempcode].class1=0;
           tempcode[ptempcode].place1=0;
           tempcode[ptempcode].class2=0;
           tempcode[ptempcode].place2=0;
           tempcode[ptempcode].class3=100;
           tempcode[ptempcode].place3=ptempcode+2;
           ptempcode++;
           tempcode[ptempcode].opplace=29;
           tempcode[ptempcode].class1=-2;
           tempcode[ptempcode].place1=0;
           tempcode[ptempcode].class2=0;
           tempcode[ptempcode].place2=0;
           tempcode[ptempcode].class3=6;
	   tempcode[ptempcode].place3=lengthT;
           ptempcode++;
           pstack2=pstack2-2;
           
           stack2[pstack2-1].class=6;
           stack2[pstack2-1].place=lengthT;
           lengthT++;
           break;             
   }
}
#include <stdio.h>
#include <ctype.h>
main()
{int wordlength=0;
 int i,ch;
 char cc;
 char text[1000];
 int textlength=1;
int action,jump,rightlength;
 printf("please enter your codes here:\n");
 cc=getchar();
 text[0]=cc;
 while(textlength!=0 && (cc=getchar())!='#')
      {ch=cc;
       if(text[textlength-1]==' ' && cc==' ')
         continue;
       else if(text[textlength-1]==' ' && ch==10)
         continue;
       else if(text[textlength-1]!=' ' && ch==10)
         {text[textlength]=' ';textlength++;}
       else {text[textlength]=cc;textlength++;}
      }
 if(text[textlength-1]==' ') textlength--;
printf("\n");
for(i=0;i<textlength;i++)
printf("%c",text[i]);
printf("\n");
for(i=0;i<textlength;)
{Initword();
 wordlength=0;
 word[0]=text[i];
 wordlength++;
 if(isdigit(word[0]))                                         /*识别常数*/
   {while(isdigit(text[i+1]))
         {word[wordlength]=text[i+1];wordlength++;i++;}
    {if(IsInc()!=-1) {m=5;n=IsInc();}
     else
        {InsertData();
         m=5;n=lengthc-1;}}
    InsertResult();
    if(text[i+1]==' ')
         {i=i+2;continue;}
    else {i++;continue;}
   }
 else if(isalpha(word[0]))                                     /*识别关键字和标识符*/
   {while(isalnum(text[i+1]))
         {word[wordlength]=text[i+1];
          wordlength++;i++;
         }
         {if(IsIna()!=-1) {m=1;n=IsIna();InsertResult();}
          else if(IsInb()!=-1) {m=4;n=IsInb();InsertResult();}
          else {InsertID();m=4;n=lengthb-1;InsertResult();}
         }
    {if(text[i+1]==' ') {i=i+2;}
    else {i++;}}
    continue;
   }
 else if(IsIna()>=31 && IsIna()<=35)                           /*识别界线符*/
   {m=3;n=IsIna();
    InsertResult();
    if(text[i+1]==' ') {i=i+2;continue;}
    else {i++;continue;}
   }
 else if(IsIna()<31 && IsIna()>15)
        {if(text[i+1]==' ')                                      /*识别运算符*/
           {m=2;n=IsIna(); InsertResult();i=i+2;continue;}     
         else if(text[i+1]=='=')
              {word[1]=text[i+1];
               m=2;n=IsIna();InsertResult();
               if(text[i+2]==' ') {i=i+3;continue;}
               else {i=i+2;continue;}
              }
         else {m=2;n=IsIna();InsertResult();i++;continue;}
        }
 else printf("sth wrong in your codes!!!\n");
}
for(i=0;i<lengthd;i++)
{printf("< ");
 if(d[i].i==1) printf("guan jian zi,%d >\n",d[i].j);
 if(d[i].i==2) printf("yun suan fu,%d >\n",d[i].j);
 if(d[i].i==3) printf("jie xian fu,%d >\n",d[i].j);
 if(d[i].i==4) printf("biao shi fu,%d >\n",d[i].j);
 if(d[i].i==5) printf("chang shu,%d >\n",d[i].j);
}
for(i=0;i<lengthd;i++)
{if(d[i].i==4) 
    {expression[i].col=5;expression[i].class=4;expression[i].place=d[i].j;}
 else if(d[i].i==5)
    {expression[i].col=5;expression[i].class=5;expression[i].place=d[i].j;}
 else if(d[i].i==2)
    {if(d[i].j>=23 && d[i].j<=28)
        {expression[i].col=6;expression[i].class=2;expression[i].place=d[i].j;}
     else if(d[i].j==20)
        {expression[i].col=1;expression[i].class=2;expression[i].place=d[i].j;}
     else if(d[i].j==21)
        {expression[i].col=0;expression[i].class=2;expression[i].place=d[i].j;}
     else if(d[i].j==22)
        {expression[i].col=2;expression[i].class=2;expression[i].place=d[i].j;}
     else {printf("BOOL表达式中含非法运算符\n");return;}
    }
 else if(d[i].i==3)
    {if(d[i].j==32) {expression[i].col=3;expression[i].class=3;expression[i].place=d[i].j;}
     else if(d[i].j==33) {expression[i].col=4;expression[i].class=3;expression[i].place=d[i].j;}
     else {printf("BOOL表达式中含非法界限符\n");return;}
    }
 else {printf("BOOL表达式中含非法符号\n");return;}
}
lengthe=lengthd+1;
expression[lengthe-1].col=7;             /* # */
expression[lengthe-1].class=0;
expression[lengthe-1].place=0;
stack1[0]=0;
pstack1=0;
pstack2=0;
pexpression=0;
lengthT=1;
action=lr[stack1[pstack1]][expression[pexpression].col].action;
jump=lr[stack1[pstack1]][expression[pexpression].col].jump;
while(action!=3)
{if(action==0) {printf("error!\n");return;}
 if(action==1)
        {stack1[pstack1+1]=jump;
         pstack1++;
         stack2[pstack2].class=expression[pexpression].class;
         stack2[pstack2].place=expression[pexpression].place;
         pstack2++;
         pexpression++;         
        }
 if(action==2)
        {rightlength=getrightlength(jump);
         pstack1=pstack1-rightlength+1;
	 stack1[pstack1]=lr[stack1[pstack1-1]][8].jump;
         regress(jump);           
        } 
 action=lr[stack1[pstack1]][expression[pexpression].col].action;
 jump=lr[stack1[pstack1]][expression[pexpression].col].jump;
}
printf("\n");
for(i=0;i<ptempcode;i++)
{printf("  %d :  ",i);
 if(tempcode[i].opplace==100)
    {printf("[ goto , __ , __ , %d ]\n\n",tempcode[i].place3);
    }
 else
    {printf("[ %s ,",a[tempcode[i].opplace].str);
     {if(tempcode[i].class1==-1) printf(" 0 ,");
     else if(tempcode[i].class1==-2) printf(" 1 ,");
     else if(tempcode[i].class1==0) printf(" __ ,");
     else if(tempcode[i].class1==6) printf(" T%d ,",tempcode[i].place1);
     else if(tempcode[i].class1==4) printf(" %s ,",b[tempcode[i].place1].str);
     else printf(" %s ,",c[tempcode[i].place1].str);}     
     {if(tempcode[i].class2==0) printf(" __ ,");
     else if(tempcode[i].class2==6) printf(" T%d ,",tempcode[i].place2);
     else if(tempcode[i].class2==4) printf(" %s ,",b[tempcode[i].place2].str);
     else {printf(" %s ,",c[tempcode[i].place2].str);}}
     {if(tempcode[i].class3==100) printf(" %d ]\n\n",tempcode[i].place3);
     else {printf(" T%d ]\n\n",tempcode[i].place3);} }
    }
}
}




输入
aa>=10 | b<c & (!a) #
回车 

⌨️ 快捷键说明

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