预测分析法实现的明升国际-nick19842000

/************************************************************************

 *    名字   

 *    文档作图:预测分析法使掉转船头的明升国际。分析后面的语法:

 *                                E->E+T | E-T | T

 *                                T->T*F | T/F |F

 *                                F->(E) | i

 *                                去世:每行牵制一个人态度的文本文档(#号码的基本事实的事物)

 *                                去世:成教训或不成教训分析。

 *    创建人:余洪周   2006-12-16

 *    版本号: 

 *    阐明    用于显示手巧的的方便列举如下所示表现方法:

                               A=E”  B=T”

 *                               非决定性的符:0=E1=E”  2=T  3=T”  4=F 

 *                               决定性的符  0=i  1=+  2=-  3=*  4=/  5=(  6=)  7=#

 ***********************************************************************/

#include

#include

struct struCH{

       char              ch;

       struct            struCH *next;

}struCH,*temp,*head,*shift,*top,*base;

/*head指路通过单独的若干阶段来发展列表的头杂种的,shift指路静态使成为的杂种的

 *topbase分开指路堆栈的顶部和原因。

 */

FILE             *fp;

char              curchar;        /*存储器要关系上地的目前的字母。*/

char              curtocmp;     /*存储器目前的堆栈顶部的字母。*/

char              ch;

int                 right, i,j;

int table[5][9]={                /*存储器预测分析表,1For the generation,0为无*/

                     {1,0,0,0,0,1,0,0,0},

                     {0,1,1,0,0,0,1,1,1},

                     {1,0,0,0,0,1,0,0,0},

                     {0,1,1,1,1,0,1,1,1},

                     {1,0,0,0,0,1,0,0,0}};

void 次要(int argc,char *argv[]){

       void 普切(char CH)

       void pop();

       void doforpush(int t);

       void identify();

       int errnum=0, k=0, countchar=0, rownum;

       int m=0;

       int charerr=0;  /*当有法律不许可的字母时切换把持*/

       /*******************以只读方法翻开文档*********************/

       if((fp=fopen(argv[1],r)= = NULL)

              printf(“\n\tCan not open file %s,or not exist it!\n”,argv[1]);

              去世(0) /*文档不在or当你做不到的时辰,常客放弃做顺序*/

       }

       else printf(“\n\tSuccess open file: %s\n”,argv[1]);       /*成翻开文档*/

       /******************遍历全部文档检测倘若在法律不许可的字母********************/

       /*结果用while(!外币经纪资产(FP)说闲话,将有一个人单一的字母,将难以把持。,

        *这时是先计算那时的再计算w的字母数。*/

       /*[1]计算文档说得中肯字母数。*/

       while(!外币经纪资产(FP){

              ch=getc(fp);          /*这恰当的出现换衣服指导者。*/

              countchar++;        /*合乎情理文档说得中肯字母数(包罗换行符和文档完毕符)*/

       }

       倒带(FP)                   /*fp文档指导者重使调整或者成为一条直线到文档头,用于文档的后续推拿*/

       if(countchar= =0){       /*空文档*/

              printf(“\t%s is a blank file!\n”,argv[1]);

              去世(0)                  /*常客放弃做该顺序*/

       }    

       /*[2]开端遍历文档*/

       而(K<(countchar-1)){/*添加一个人换行符后countchar不停地一个人,故减1*/

              ch=getc(fp);          

              if(!(CH '(' | | CH ')' | | CH 我| | CH | | CH -| | CH *| | CH /| | CH #| | CH =”\n”)){

                     charerr=1;errnum++;/*charerror颠倒印记,errnum合乎情理颠倒数*/

              }

              k++;      

       }

       倒带(FP)            /*fp文档指导者重使调整或者成为一条直线到文档头,向上面的一组链表推拿*/

       if(charerr= =1){     /*文档中有法律不许可的字母。*/

              printf(“\n\t%d Unindentify characters in file %s \n”,errnum,argv[1]);

              去世(0)           /*常客放弃做该顺序*/

       }

       /*******************非空字母和非法律不许可的字母,实施歧视推拿。*****************/

       向(rownum = 1;M<(countchar-1);rownum++){    /*歧视所相当行,rownum记载行数*/

              /* 初始变量和堆栈*/

              right=1;         

              /* ”#””E”坚决进行下去*/

              base=malloc(sizeof(struCH));   /*设定初值堆栈*/

              base->next=NULL;

              base->ch=”#”;

              temp=malloc(sizeof(struCH));

              temp->next=base;

              temp->ch=”E”;

              top=temp;                               /*栈顶指导者top指路堆栈的顶部。*/

              /*初始沉淀待歧视的态度的通过单独的若干阶段来发展链表头*/

              shift=malloc(sizeof(struCH));

              shift->next=NULL;

              head=shift;

              /*读不育系以形成物一个人通过单独的若干阶段来发展表*/

              ch=getc(fp);putchar(CH)m++;

              而(CH!=”\n”&&m<(countchar)){ /*行末or到文档尾。基本事实,将读取文档结果符。*/

                     /*读取ch,瞄准存款链*/

                     temp=malloc(sizeof(struCH));

                     temp->ch=ch;

                     temp->next=NULL;

                     shift->next=temp;

                     shift=shift->next;

                     ch=getc(fp);

                     结果(M!=(countchar-1)) putchar(CH)  /*不去世基本事实一个人读的文档结果符*/

                     m++;

              }

              head=head->next;        /*驱逐第一个人空杂种的,并使head请参阅非空链头。*/

              shift=head;                   /*shift指路头叉点,用于后续的歧视推拿*/

              putchar(”\n”);

              identify();                     /*开端歧视不育系*/

              if(!右)                       /*颠倒注意事项:[名字] Line [线数]:error expression!*/

                     printf(%s  Line %d:\t  error expression!\n”,argv[1],线数)     

              else                              /*弥撒书的章节的注意事项:[名字] Line [线数]:right expression!*/

                     printf(%s  Line %d:\t  right expression!\n”,argv[1],线数)      

              putchar(”\n”);

       }/*end for*/   

       printf(成功!\n”);

       闭上文档(FP)      /*闭上文档*/

       去世(0)           /*常客放弃做顺序*/

}

/*堆栈功用*/

void 推(char CH)

       temp=malloc(sizeof(struCH));

       temp->ch=ch;

       temp->next=top;

       top=temp;

}

/*堆栈功用*/

void 流行音乐(虚空)

       curtocmp=top->ch;

       if(top->ch!=”#”)

              top=top->next;

}

/*土地弄明白的b值求出相符合的使成为腔调,兼并拟定草案栈*/

void doforpush(int t){

       使脱轨(T)

              case 0:把(A);推(不);溃

              case 5:把(A);推(不);溃

              case 11:push(”A”);push(”T”);push(”+”);break;

              case 12:push(”A”);push(”T”);push(”-”);break;

              case 20:把(B);推(F);溃

              case 25:把(B);推(F);溃

              case 33:push(”B”);push(”F”);push(”*”);break;

              case 34:push(”B”);push(”F”);push(”/”);break;

              case 40:推(我);突变

              case 45:推(')');推(e);推('(')

       }

}

/*土地curchar,curtocmp上数字,以决定倘若有随便哪一个典型的夸张的行动或形象。*/

void changchartoint()

{

       switch(curtocmp)          /*非决定性的符:栈顶*/

       {

              case a:I=1;挂

              case B:I=3;挂

              case e:I=0;挂

              case T:I=2;挂

              case ”F”:i=4;

       }

       switch(curchar)             /*决定性的符:在要歧视的态度中*/

       {

              case 我:j = 0;挂

              case ”+”:j=1;break;

              case ”-”:j=2;break;

              case ”*”:j=3;break;

              case ”/”:j=4;break;

              case ”(”:j=5;break;

              case ”)”:j=6;break;

              case ”#”:j=7;

       }

}

/*歧视算法功用*/

void identify()

{

       int t;

       for(;;)

       {

              pop();                                  /*读取堆栈顶部的字母内存。curtocmp*/

              curchar=shift->ch;                /*读链说得中肯字母存储器器curchar*/

              printf(“\t%c–>%c\n”,curchar,curtocmp);           

              if(curtocmp==”#” && curchar==”#”)                     break;

              if(curtocmp==”A”||curtocmp==”B”||curtocmp==”E”||curtocmp==”T”||curtocmp==”F”){

                     if(curtocmp!=”#”){         /*[1]不到堆栈原因,婚配字母*/

                            changchartoint();

                            结果(表i [ j ] ]               /*[]有发生式*/

                                   t=10*i+j;               /*计算阵列中使成为的地位。*/

                                   doforpush(t);         /*找到对应t的发生式,兼并拟定草案栈*/

                                   continue;

                            }

                            else{                             /*[]不注意夸张的行动或形象*/

                                   right=0;                  /*出错*/

                                   break;

                            }

                     }

                     else{                               /*[2]到堆栈原因,目前的关系上地字母是”#”*/

                            if(curtocmp!=curchar){ /*去世行说得中肯基本事实一个人字母过失”#”*/

                                   right=0;                 /*出错*/

                                   break;

                            }

                            else

                                   break;                   /*弥撒书的章节*/

                     }

              }

              else{       /*结果目前的字母是结果符*/

                     if(curtocmp!=curchar){

                            right=0;                      /*出错*/

                            break;

                     }

                     else{

                            shift=shift->next;        /*读紧邻的人字母*/

                            continue;

                     }

              }

       }/*end for*/

}

发表评论