您的位置:首页 > 编程语言 > C语言/C++

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

2017-06-02 18:36 423 查看

简单优先分析算法

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

/*
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]
=='>')
{
cout<<"这不是一个句子";
break;
}
else if(b[m1]
==' ')
{
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]
=='>')
{
pop(m);
push(m,'T');
}
else if(b[m1]
==' ')
{
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]
=='>')
{
pop(m);
push(m,'R');
}
else if(b[m1]
==' ')
{
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]
=='>')
{
pop(m);
push(m,'S');
}
else if(b[m1]
==' ')
{
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]
=='>')
{
cout<<"这不是一个句子";
break;
}
else if(b[m1]
==' ')
{
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]
=='>')
{
cout<<"这不是一个句子";
break;
}
else if(b[m1]
==' ')
{
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]
=='>')
{
cout<<"这不是一个句子";
break;
}
else if(b[m1]
==' ')
{
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]
=='>')
{
cout<<"这不是一个句子";
break;
}
else if(b[m1]
==' ')
{
cout<<"这不是一个句子";
break;
}
else
{
push(m,*j);
j++;
}
}
//外层等于)))

//外层$$$
else if(m->data[m->top]=='$')
{
push(m,*j);
j++;
}
// 外层$$$
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息