编译原理算符优先分析算法
来源:互联网 发布:华为网络面试 知乎 编辑:程序博客网 时间:2024/05/18 15:06
算符优先分析算法
编译原理中自下而上的算符优先分析算法是一种“移进-规约”法,本例运用的是编译原理第三版何炎祥中的算符优先分析算法,省去了输出分析过程部分,读者可以参考我发的编译原理语法分析器中的输出部分写出本算法的输出部分。下附加代码:
/*Name: 自上而下算符优先分析算法 Copyright: Author: cc Date: 18/04/17 16:26Description: 根据固定的分析表(自定义添加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[5][6]={{'>','<','<','<','>','>'},//自定义分析表分析表 {'>','>','<','<','>','>'},{'>','>',' ',' ','>','>'},{'<','<','<','<','=','>'},{'>','>',' ',' ','>','>'}}; message *m;int n;create(m); cout<<"输入字符串,字符串以$结尾,例如 (i+i)*i$"<<endl; char str[20]; getStr(str); //获取以$结尾字符串 char *j=str;push(m,'$');push(m,*j);j++;//构造符号栈结构保存每一次的变化 while(true){if(m->data[m->top]=='v'&& m->data[m->top-1]=='+' && m->data[m->top-2]=='v')//素短语v+v { pop(m); pop(m); pop(m); push(m,'v'); } else if(m->data[m->top]==')' && m->data[m->top-1]=='v' && m->data[m->top-2]=='(')//素短语(v) { pop(m); pop(m); pop(m); push(m,'v'); } else if(m->data[m->top]=='v' && m->data[m->top-1]=='*' && m->data[m->top-2]=='v')//素短语v*v { pop(m); pop(m); pop(m); push(m,'v'); } //外层等于+++ else if(m->data[m->top]=='+') { int m1=0; switch(*j) { case '+':n=0;break; case '*':n=1;break; case 'i':n=2;break; case '(':n=3;break; case ')':n=4;break; case '$':n=5;break; } if(b[m1][n]=='>') { pop(m); push(m,'v'); } else { push(m,*j); j++; } } //外层等于+++ //外层等于*** else if(m->data[m->top]=='*') { int m1=1; switch(*j) { case '+':n=0;break; case '*':n=1;break; case 'i':n=2;break; case '(':n=3;break; case ')':n=4;break; case '$':n=5;break; } if(b[m1][n]=='>') { pop(m); push(m,'v'); } else { push(m,*j); j++; } } //外层等于*** //外层等于iii else if(m->data[m->top]=='i') { int m1=2; switch(*j) { case '+':n=0;break; case '*':n=1;break; case 'i':n=2;break; case '(':n=3;break; case ')':n=4;break; case '$':n=5;break; } if(b[m1][n]=='>') { pop(m); push(m,'v'); } else { push(m,*j); j++; } } //外层等于iii //外层等于((( else if(m->data[m->top]=='(') { int m1=3; switch(*j) { case '+':n=0;break; case '*':n=1;break; case 'i':n=2;break; case '(':n=3;break; case ')':n=4;break; case '$':n=5;break; } if(b[m1][n]=='>') { pop(m); push(m,'v'); } else { push(m,*j); j++; } } //外层等于((( //外层等于)))) else if(m->data[m->top]==')') { int m1=4; switch(*j) { case '+':n=0;break; case '*':n=1;break; case 'i':n=2;break; case '(':n=3;break; case ')':n=4;break; case '$':n=5;break; } if(b[m1][n]=='>') { pop(m); push(m,'v'); } else { push(m,*j); j++; } }//外层等于)))) //内层以有v开始部分 else if(m->data[m->top]=='v') { if(*j=='$') { if(m->data[m->top-1]=='$') { cout<<"这是一个句子"; break; } else { cout<<"这不是一个句子"; break; } } //内层+++ else if(m->data[m->top-1]=='+') { int m1=0; switch(*j) { case '+':n=0;break; case '*':n=1;break; case 'i':n=2;break; case '(':n=3;break; case ')':n=4;break; case '$':n=5;break; } if(b[m1][n]=='>') { pop(m); push(m,'v'); } else { push(m,*j); j++; } } //内层*** else if(m->data[m->top-1]=='*') { int m1=1; switch(*j) { case '+':n=0;break; case '*':n=1;break; case 'i':n=2;break; case '(':n=3;break; case ')':n=4;break; case '$':n=5;break; } if(b[m1][n]=='>') { pop(m); push(m,'v'); } else { push(m,*j); j++; } }//内层iii else if(m->data[m->top-1]=='i') { int m1=2; switch(*j) { case '+':n=0;break; case '*':n=1;break; case 'i':n=2;break; case '(':n=3;break; case ')':n=4;break; case '$':n=5;break; } if(b[m1][n]=='>') { pop(m); push(m,'v'); } else { push(m,*j); j++; } }//内层((( else if(m->data[m->top-1]=='(') { int m1=3; switch(*j) { case '+':n=0;break; case '*':n=1;break; case 'i':n=2;break; case '(':n=3;break; case ')':n=4;break; case '$':n=5;break; } if(b[m1][n]=='>') { pop(m); push(m,'v'); } else { push(m,*j); j++; } }//内层))) else if(m->data[m->top-1]==')') { int m1=4; switch(*j) { case '+':n=0;break; case '*':n=1;break; case 'i':n=2;break; case '(':n=3;break; case ')':n=4;break; case '$':n=5;break; } if(b[m1][n]=='>') { pop(m); push(m,'v'); } else { push(m,*j); j++; } } //内层以有v开始部分//外层$$$ else if(m->data[m->top-1]=='$'){push(m,*j); j++; } // 外层$$$ } } return 0; }
阅读全文
1 0
- 编译原理算符优先分析算法
- 编译原理(七) 算符优先分析法-构造算符优先关系表算法
- 编译原理简单优先分析算法
- 编译原理(八) 算符优先分析法(分析过程的算法和C++实现)
- 编译原理(八) 算符优先分析法(分析过程的算法和C++实现)
- 编译原理(七) 算符优先分析法(构造算符优先关系表算法及C++实现)
- 编译原理(七) 算符优先分析法(构造算符优先关系表算法及C++实现)
- 编译原理(七) 算符优先分析法(构造算符优先关系表算法及C++实现)
- 编译原理实验之语法分析(算符优先分析算法(C语言))
- 编译原理(八) 算符优先分析法-分析过程
- 编译原理——算符优先分析
- 编译原理实验3-算符优先分析法
- [编译原理]算符优先文法分析与实现
- 简单算符优先文法分析程序(编译原理)
- 编译原理之算符优先分析语法程序
- 编译原理实验——算符优先算法
- 编译原理-算符优先
- 编译原理-算符运算优先
- python014 -- 常用内建函数
- 有序表查找
- mysql ERROR 1050 (42S01): Table already exists
- myeclipse的servlet及jsp模板自定义
- classpath的含义
- 编译原理算符优先分析算法
- DES 加密 解密 工具类
- 隐藏元素的八种方法
- hdu1878—欧拉回路(欧拉回路判断)
- vue中的学习小记录
- Lua的类Class实现
- 微信小程序 运行机制 框架原理(自我学习记录)
- ZIP文件解压(java)
- 自定义adapter