编译原理简单优先分析算法
来源:互联网 发布: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
- 编译原理简单优先分析算法
- 编译原理算符优先分析算法
- 简单算符优先文法分析程序(编译原理)
- 编译简单优先分析法
- 编译原理(七) 算符优先分析法-构造算符优先关系表算法
- 编译原理(八) 算符优先分析法(分析过程的算法和C++实现)
- 编译原理(八) 算符优先分析法(分析过程的算法和C++实现)
- Java编译原理写算符优先算法
- 编译原理实验之语法分析(算符优先分析算法(C语言))
- 编译原理(七) 算符优先分析法(构造算符优先关系表算法及C++实现)
- 编译原理(七) 算符优先分析法(构造算符优先关系表算法及C++实现)
- 编译原理(七) 算符优先分析法(构造算符优先关系表算法及C++实现)
- 编译原理简单词法分析
- DFS深度优先遍历算法简单分析
- 编译原理(八) 算符优先分析法-分析过程
- 编译原理_简单优先文法_语法分析器_Java
- 编译原理——算符优先分析
- 编译原理实验3-算符优先分析法
- MySql操作命令
- Android的SharedPreferences的使用介绍
- hdu1874 dijkstra
- 中序线索化
- 关于 sql 多表 外键 插入数据 提示 fk_0002 的 问题
- 编译原理简单优先分析算法
- [Redis](数据结构)跳转表
- android 垂直可滑动时间轴 ( RecyclerView+VerticalSeekBarWrapper)
- 美团2016笔试之二维数组打印
- 用java语言实现事件委托模式
- 主席树模板(区间第k大!)hdu2665
- 开发环境搭建
- 编程第九十一天
- JAVA各种系统架构图及其简介