编译原理简单优先分析算法

来源:互联网 发布:linux下jira安装教程 编辑:程序博客网 时间:2024/06/06 02:44

简单优先分析算法

       编译原理简单优先分析算法是一种自下而上的分析算法,本例是编译原理第三版何炎祥中一个简单优先分析算法的例子,未给出分析过程分析代码,读者可以参考我的语法分析器中输出代码,写出此算法的输出部分。下附加代码:

/*Name: 简单优先分析算法Copyright: Author: cc Date: 15/05/16 18:20Description:  根据固定的分析表(自定义添加b>$),对输入以$结尾的字符串进行判断是否符合语法 */#include<iostream>#include<stdlib.h>using namespace std;typedef struct{char data[10];int top;} message;//栈内元素对象 void create(message *&m){m=(message *)malloc(sizeof(message));m->top=-1;}void push(message *&m,char i)//进栈操作 {if(m->top<10){m->top++;m->data[m->top]=i;}elsecout<<"栈满"; }char pop(message *&m) //出栈操作 {char i;if(m->top!=-1){i=m->data[m->top];m->top--;return i;}elsecout<<"栈空"; }void getStr(char str[]) //将输入的以$结尾的字符串 保存于字符串数组中 {int j=0;while(true){cin>>str[j];if(str[j]=='$')break;elsej++;}}int main(){char b[9][9]={{' ',' ',' ',' ',' ',' ',' ','=','>'},//分析表 {' ',' ',' ',' ',' ','=',' ','>','>'},{' ',' ',' ',' ',' ',' ',' ','>','>'},{' ',' ',' ',' ',' ','>',' ','>','>'},{' ',' ',' ',' ',' ','>',' ','>','>'}, {' ','<','=','<','<',' ','<',' ','>'},{'=','<','<','<','<',' ','<',' ','>'},{' ',' ',' ',' ',' ','>',' ','>','>'},{'<','<','<','<','<','<','<','<','='}}; message *m;int n;create(m);    cout<<"输入字符串,字符串以$结尾,例如 ((a),a)$"<<endl;     char str[20];    getStr(str); //获取以$结尾字符串     char *j=str;push(m,'$');while(true){if(m->data[m->top-1]=='$'&&m->data[m->top]=='S'){if(*j=='$'){cout<<"这是一个句子";break; }else{cout<<"这不是一个句子";    break; }}if(m->data[m->top]=='T'&& m->data[m->top-1]==',' && m->data[m->top-2]=='S')//产生式 (S,T)   {  pop(m);  pop(m);  pop(m);  push(m,'T');  }   else if(m->data[m->top]==')' && m->data[m->top-1]=='R' && m->data[m->top-2]=='(')//产生式(R)   {  pop(m);  pop(m);  pop(m);  push(m,'S');  }  //外层等于RRR  else if(m->data[m->top]=='R')    {    int m1=0;    switch(*j)    {    case 'R':n=0;break;    case 'S':n=1;break;    case 'T':n=2;break;    case 'a':n=3;break;    case '^':n=4;break;    case ',':n=5;break;    case '(':n=6;break;    case ')':n=7;break;    case '$':n=8;break;    }    if(b[m1][n]=='>')    {       cout<<"这不是一个句子";          break;    }    else if(b[m1][n]==' ')     {         cout<<"这不是一个句子";          break;     }      else     {      push(m,*j);      j++;     }    }    //外层等于RRR          //外层等于SSS  else if(m->data[m->top]=='S')    {    int m1=1;    switch(*j)    {    case 'R':n=0;break;    case 'S':n=1;break;    case 'T':n=2;break;    case 'a':n=3;break;    case '^':n=4;break;    case ',':n=5;break;    case '(':n=6;break;    case ')':n=7;break;    case '$':n=8;break;    }    if(b[m1][n]=='>')    {        pop(m);        push(m,'T');    }    else if(b[m1][n]==' ')     {         cout<<"这不是一个句子";          break;     }      else     {      push(m,*j);      j++;     }    }    //外层等于SSS        //外层等于TTT  else if(m->data[m->top]=='T')    {    int m1=2;    switch(*j)    {    case 'R':n=0;break;    case 'S':n=1;break;    case 'T':n=2;break;    case 'a':n=3;break;    case '^':n=4;break;    case ',':n=5;break;    case '(':n=6;break;    case ')':n=7;break;    case '$':n=8;break;    }    if(b[m1][n]=='>')    {        pop(m);        push(m,'R');    }    else if(b[m1][n]==' ')     {         cout<<"这不是一个句子";          break;     }      else     {      push(m,*j);      j++;     }    }    //外层等于TTT         //外层等于aaa  else if(m->data[m->top]=='a')    {    int m1=3;    switch(*j)    {    case 'R':n=0;break;    case 'S':n=1;break;    case 'T':n=2;break;    case 'a':n=3;break;    case '^':n=4;break;    case ',':n=5;break;    case '(':n=6;break;    case ')':n=7;break;    case '$':n=8;break;    }    if(b[m1][n]=='>')    {        pop(m);        push(m,'S');    }    else if(b[m1][n]==' ')     {         cout<<"这不是一个句子";          break;     }      else     {      push(m,*j);      j++;     }    }    //外层等于aaa        //外层等于^^^  else if(m->data[m->top]=='^')    {    int m1=4;    switch(*j)    {    case 'R':n=0;break;    case 'S':n=1;break;    case 'T':n=2;break;    case 'a':n=3;break;    case '^':n=4;break;    case ',':n=5;break;    case '(':n=6;break;    case ')':n=7;break;    case '$':n=8;break;    }    if(b[m1][n]=='>')    {    cout<<"这不是一个句子";          break;    }    else if(b[m1][n]==' ')     {         cout<<"这不是一个句子";          break;     }      else     {      push(m,*j);      j++;     }    }    //外层等于^^^        //外层等于,,,  else if(m->data[m->top]==',')    {    int m1=5;    switch(*j)    {    case 'R':n=0;break;    case 'S':n=1;break;    case 'T':n=2;break;    case 'a':n=3;break;    case '^':n=4;break;    case ',':n=5;break;    case '(':n=6;break;    case ')':n=7;break;    case '$':n=8;break;    }    if(b[m1][n]=='>')    {    cout<<"这不是一个句子";          break;    }    else if(b[m1][n]==' ')     {         cout<<"这不是一个句子";          break;     }      else     {      push(m,*j);      j++;     }    }    //外层等于,,,        //外层等于(((  else if(m->data[m->top]=='(')    {    int m1=6;    switch(*j)    {    case 'R':n=0;break;    case 'S':n=1;break;    case 'T':n=2;break;    case 'a':n=3;break;    case '^':n=4;break;    case ',':n=5;break;    case '(':n=6;break;    case ')':n=7;break;    case '$':n=8;break;    }    if(b[m1][n]=='>')    {    cout<<"这不是一个句子";          break;    }    else if(b[m1][n]==' ')     {         cout<<"这不是一个句子";          break;     }      else     {      push(m,*j);      j++;     }    }    //外层等于(((        //外层等于)))  else if(m->data[m->top]==')')    {    int m1=7;    switch(*j)    {    case 'R':n=0;break;    case 'S':n=1;break;    case 'T':n=2;break;    case 'a':n=3;break;    case '^':n=4;break;    case ',':n=5;break;    case '(':n=6;break;    case ')':n=7;break;    case '$':n=8;break;    }    if(b[m1][n]=='>')    {       cout<<"这不是一个句子";          break;    }    else if(b[m1][n]==' ')     {         cout<<"这不是一个句子";          break;     }      else     {      push(m,*j);      j++;     }    }    //外层等于)))     //外层$$$ else if(m->data[m->top]=='$'){push(m,*j);      j++; } // 外层$$$     }   return 0; }

阅读全文
1 0
原创粉丝点击