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

简单优先分析算法

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

/*
Name: 简单优先分析算法
Copyright: 
Author: cc 
Date: 15/05/16 18:20
Description:  根据固定的分析表(自定义添加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;
}
else
cout<<"栈满"; 
}
char pop(message *&m) //出栈操作 
{
char i;
if(m->top!=-1)
{
i=m->data[m->top];
m->top--;
return i;
}
else
cout<<"栈空"; 
}
void getStr(char str[]) //将输入的以$结尾的字符串 保存于字符串数组中 
{
int j=0;
while(true)
{
cin>>str[j];
if(str[j]=='$')
break;
else
j++;
}
}
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
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值