编译原理简单优先分析算法
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;
}
相关文章推荐
- 编译原理实验之语法分析(算符优先分析算法(C语言))
- 编译原理之算术表达式的词法分析算法c实现
- 编译原理实验之预测分析算法的设计与实现
- 编译原理之自底向上优先分析
- 编译原理简单语法分析
- DFS深度优先遍历算法简单分析
- 编译原理-简单的语法分析示例
- 编译原理(七) 算符优先分析法(构造算符优先关系表算法及C++实现)
- 编译原理_简单优先文法_语法分析器_Java
- 编译原理 实验总结及实现分析 递归下降与算符优先原理
- 编译原理简单的LALR(1)分析表的构造
- 编译原理LL1文法分析表算法实现
- 编译原理(八) 算符优先分析法(分析过程的算法和C++实现)
- [系列][编译原理]LR(0)分析算法的定义
- 编译原理简单词法分析
- 编译原理(七) 算符优先分析法(构造算符优先关系表算法及C++实现)
- 编译原理(八) 算符优先分析法(分析过程的算法和C++实现)
- 编译原理(七) 算符优先分析法(构造算符优先关系表算法及C++实现)
- 一个简单的编译原理词法语法语义分析程序
- 编译原理之算符优先分析语法程序