代码如下:

#include<iostream.h>
#include<string.h>
#include<stdlib.h>
int tree[50];
int j=0,k=0;
char process[50][10];
const int action[10][7]={-1,-1,2,-1,3,-1,1,4,5,-1,-1,-1,0,-1,-1,-1,2,-1,3,-1,6,104,104,-1,104,-1,104,-1,-1,-1,2,-1,3,-1,7,-1,-1,2,-1,3,-1,8,4,5,-1,9,-1,-1,-1,101,5,-1,101,-1,101,-1,102,102,-1,102,-1,102,-1,103,103,-1,103,-1,103,-1,
};
struct table{char x;int state}grammer[]={{'S',1},{'E',3},{'T',3},{'F',3},{'F',1}};
int convert(char m)
{ int id;
switch(m)
{ case'i':id=0;break;case'+':id=1;break;case'*':id=2;break;case'(':id=3;break;case')':id=4;break;case'$':id=5;break;case'E':id=6;break;case'T':id=7;break;case'F':id=8;break;default:id=199;}
return id;
}
void main()
{char in_string[20],*now,temp,*r;int i=0,tep=1,sta_a,ope_a,sta_b,ope_b,temp1,temp2;bool signal=true;int sta_stack[50]={0};char ope_stack[50]={'$};int top=0;cout<<"输入待分析表达式:\n";do{cin>>in_string[i++];}while(in_string[i-1]!='$');
in_string[i]='\0';
for(int q=0;q<=i-2;q++)
process[k][q]=in_string[q];
k=k+1;
now=in_string;
while(signal)
{
temp=*now;
ope_a=convert(temp);
sta_a=sta_stack[top];
if(ope_a==199)
{cout<<"此文法无法识别该表达式!\n";break;
}
int value=action[sta_a][ope_a];
if(value>0&&value!=0)
{ top=top+1;ope_stack[top]=temp;sta_stack[top]=value;now++;
}
else if(value<0)
{ temp1=-value;temp2=grammer[temp1].state;top=top-temp2;sta_b=sta_stack[top];ope_b=convert(grammer[temp1].x);if(action[sta_b][ope_b]!=0){top=top+1;sta_stack[top]=action[sta_b]ope_b];ope_stack[top]=grammer[temp1].x;tree[j++]=temp1;for(i=1;i<=top;i++)process[k][i-1]=ope_stack[i];i=i-1;r=now;while(*r!='$'){process[k][i++]=*r;r++;}k++;}else{cout<<"该此文法无法识别该表达式!\n";break;}
}
else if(value==0)
{cout<<"该此文法无法识别该表达式!\n";break;
}
else if(value==99)
{cout<<"此表达式可分析!"<<endl;
break;
}
for(i=0;i<=top;i++)cout<<ope_stack[i];
cout<<'\t'<<'\t';
cout<<now<<'\t';
if(value>0&&value!=0)cout<<'S'<<value<<endl;
else if(value<0)cout<<'r'<<value<<endl;
}2
#include<iostream>
#include<stdlib.h>
#include<fstream>
#include<string.h>
#include<string>
#include<algorithm>
using namespace std;
typedef struct
{int num;
char texts[25];
}aa;
string s[5]={"S->E","E->E+E","E->E*E","E->(E)","E->i"};
char c1[7]={'+','*','(',')','i','#','E'};
int e[10][7]={-1,-1,2,-1,3,-1,1,4,5,-1,-1,-1,0,-1,-1,-1,2,-1,3,-1,6,104,104,-1,104,-1,104,-1,-1,-1,2,-1,3,-1,7,-1,-1,2,-1,3,-1,8,4,5,-1,9,-1,-1,-1,101,5,-1,101,-1,101,-1,102,102,-1,102,-1,102,-1,103,103,-1,103,-1,103,-1,};void pop(aa &a1)
{a1.num--;
return;
}char top(aa &a1)
{return(a1.texts[a1.num]);}void push(aa &a1,char c)
{a1.num++;
a1.texts[a1.num]=c;
return;
}int search2(char ch)
{
int i;
for(i=0;i<7;i++)
{if(c1[i]==ch)
return i;
}
}void main(void){aa a1,a2,a3;a1.num=-1;a2.num=-1;a3.num=-1;int i,n,j,t,d;
push(a1,'0');
push(a2,'#');
push(a3,'#');
string s0;
cin>>s0;
n=0;
for(i=0;i<s0.length();i++)
{if(s0[i]>='0'&&s0[i]<='9'||s0[i]>='a'&&s0[i]<='z'||s0[i]>='A'&&s0[i]<='Z')s0[i]='i';}
for(i=s0.length()-1;i>=0;i--)
{if(s0[i]=='i') n++;else n=0;
if(n<=1)
push(a3,s0[i]);
}while(a3.num>-1)
{j=search2(top(a3));i=top(a1)-'0';if(e[i][j]==0) {cout<<"accept"<<'\n';return;}if(e[i][j]<0) {cout<<"error"<<'\n';cout<<"e["<<i<<"]"<<"["<<j<<"]=-1"<<'\n';return;}else if(e[i][j]>100) {t=e[i][j]-100;d=s[t].length()-3;for(n=0;n<d;n++){pop(a1);pop(a2);}push(a3,s[t][0]);}else {t=e[i][j];push(a1,t+'0');push(a2,top(a3));pop(a3);}}}

用c++实现LR语法分析器 通过LR分析表及三个栈形成对输入表达式的判断!相关推荐

  1. 编译原理:LL(1)文法 语法分析器(预测分析表法)

    设计要求:对于任意输入的一个LL(1)文法,构造其预测分析表,并对指定输入串分析其是否为该文法的句子. 思路:首先实现集合FIRST(X)构造算法和集合FOLLOW(A)构造算法,再根据FIRST和F ...

  2. 【编译原理】LR语法分析器的设计与实现

    LR语法分析器的设计与实现 本文为当时编译原理实验作业,要求用设计的思想完成,小题大做,仅供参考 文章目录 LR语法分析器的设计与实现 实验要求 实现功能 输入输出 样例 一.LR语法分析器问题定义 ...

  3. lr 1 语法分析器c语言,LR语法分析器

    1 LR语法分析器 本节介绍一个有效的自底向上的分析技术,可以用于一大类上下文无关文法的语法分析.这种技术叫做LR(k)分析法,其中L表示从左到右扫描输入串,R表示构造一个最右推导的逆过程,k指的是在 ...

  4. LR(1)语法分析器生成器(生成Action表和Goto表)java实现(二)

    updata : 附我之前bilibili讲解视频链接 : https://www.bilibili.com/video/av63666423?share_medium=android&sha ...

  5. lr1分析器c语言实验报告怎么写,编译原理课程的设计构造LR分析法语法分析器.doc...

    编译原理课程的设计构造LR分析法语法分析器 太 原 学 院 课程设计报告书 课程名称 设计题目 构造LR(0)分析法语法分析器 专业班级 学 号 姓 名 指导教师 2016年 12 月 15日 目 录 ...

  6. java实现语法分析器_语法分析 | 语法分析的任务

    在之前,我们有对编译器做过一定的介绍,我们认为编译器是具有一定流水线结构的软件系统.它可以分为前端,中端和后端这样的不同的阶段. 编译器前端 对于我们正在研究的前端,我们已经通过词法分析的学习掌握了从 ...

  7. 编译原理-6-LR语法分析器

    LR语法分析器 自顶向下的.不断归约的.基于句柄识别自动机的.适用于LR(∗) 文法的.LR(∗) 语法分析器 只考虑无二义性的文法 1. 构建语法树过程 自底向上构建语法分析树 根节点是文法的起始符 ...

  8. 使用c/c++实现SLR(1)语法分析器

    使用c/c++实现SLR1语法分析器 一.前言 二.具体实现 1.结构体介绍 analysis_table_cell.h collection.h item.h prodection_rule.h s ...

  9. LR(0)分析表的构建

    LR(0)分析表的构建 一.实验要求 构建LR(0)分析表 例: G[E]: E->aA E->bB A->cA A->d B->cB B->d 二.实验原理 在网 ...

最新文章

  1. Tomcat服务器java.lang.IllegalArgumentException异常
  2. Linux下nginx安装与配置
  3. 记一次kafka数据丢失问题的排查
  4. mac远程怎么操作?苹果电脑怎么远程协助?
  5. Jeewx-Enterprise_1.1版本发布,开源微信企业号开发平台
  6. 更新失败 连接超时_苹果发布 iOS iPadOS 更新 修复蓝牙连接失败等错误
  7. #计算机网络#学习笔记-常用端口详解
  8. Sqlmap脱库之“你的数据我所见”
  9. 华为HCIE认证考试简介
  10. JS中的List转Map
  11. Springboot 406错误
  12. 拉钩网前端项目实战02
  13. iOS基础——通过案例学知识之LaunchScreen、APPIcon、StatusBar、UIScrollView、UIPageControl
  14. Elasticsearch 原理,安装,生产配置以及常见CRUD,ILM管理,常见API解析,go-elasticsearch-client使用
  15. html首字母样式,CSS实现段落首字母、首字放大特效
  16. PNAS:控制缺乏情感的肢体语言的大脑回路
  17. cannot import name ‘gcd’ from ‘fractions’
  18. matlab与单片机联合开发【一】
  19. python 'NoneType' object has no attribute '_root'
  20. Maya 更改模型枢轴位置 Day1

热门文章

  1. 从Pixel 3a到Android Q,一份谷歌AI能力的“成绩单” | Google I/O全程回顾
  2. 渡鸦创始人离职百度后的下一个“真相”
  3. AI一分钟|传谷歌正与腾讯等洽谈合作,欲在中国推云服务;国产超算运算速度或达每秒百亿亿次...
  4. 为什么 Java 中“1000==1000”为false,而”100==100“为true?
  5. 考考基础部分,谈谈Java集合中HashSet的原理及常用方法
  6. RESTful API 设计规范精讲
  7. IDEA 新特性:提前知道代码怎么走
  8. 面试问我,创建多少个线程合适?我该怎么说
  9. 面试必备:Java线程池解析
  10. Datawhale浙大分享(附投票结果)