# include <stdio.h>
# include <string.h> //存储LR(0)分析表
struct node
{
char ch;
int num;
};
struct node table[]={ {'s',},{'t',},{'t',},{'s',},{'t',},{'t',},{'t',},{'t',},{'t',},
{'t',},{'s',},{'t',},{'t',},{'t',},{'a',},{'t',},{'t',},{'t',},
{'t',},{'r',},{'s',},{'t',},{'r',},{'r',},{'t',},{'t',},{'t',},
{'t',},{'r',},{'r',},{'t',},{'r',},{'r',},{'t',},{'t',},{'t',},
{'s',},{'t',},{'t',},{'s',},{'t',},{'t',},{'t',},{'t',},{'t',},
{'t',},{'r',},{'r',},{'t',},{'r',},{'r',},{'t',},{'t',},{'t',},
{'s',},{'t',},{'t',},{'s',},{'t',},{'t',},{'t',},{'t',},{'t',},
{'s',},{'t',},{'t',},{'s',},{'t',},{'t',},{'t',},{'t',},{'t',},
{'t',},{'s',},{'t',},{'t',},{'s',},{'t',},{'t',},{'t',},{'t',},
{'t',},{'r',},{'s',},{'t',},{'r',},{'r',},{'t',},{'t',},{'t',},
{'t',},{'r',},{'r',},{'t',},{'r',},{'r',},{'t',},{'t',},{'t',},
{'t',},{'r',},{'r',},{'t',},{'r',},{'r',},{'t',},{'t',},{'t',},
}; //符号栈以及状态栈
struct node1
{
int pop;
int data[];
char str[];
}q1; int total=; //步骤
int i; //输入串下标
int function(int a,char c,int temp); int main()
{ char ch[];//存储输入串 //栈初始化
q1.data[]=;
q1.pop=;
q1.str[]='#'; i=;
int temp; //下标转换
int aaa; //函数返回值,0代表输入串成功分析,1代表出错或者接受 gets(ch); //输入串; // 输出表头和初始化的状态
printf("步骤\t状态栈\t符号栈\t输入串\t动作\n");
printf("%d\t%d\t#\t%s\t",++total,q1.data[],ch); //循环输出中间过程
while()
{
temp=;
//面临不同的输入串采取不同的动作,由函数function实现
if(ch[i] == 'i')
{
temp=q1.data[q1.pop-]*+;
aaa=function(,'i',temp); }
else if(ch[i] == '+')
{
temp=q1.data[q1.pop-]*+;
aaa=function(,'+',temp); }
else if(ch[i] == '*')
{
temp=q1.data[q1.pop-]*+;
aaa=function(,'*',temp); }
else if(ch[i] == '(')
{
temp=q1.data[q1.pop-]*+;
aaa=function(,'(',temp); }
else if(ch[i] == ')')
{
temp=q1.data[q1.pop-]*+;
aaa=function(,')',temp); }
else if(ch[i] == '#')
{
temp=q1.data[q1.pop-]*+;
aaa=function(,'#',temp); }
if(aaa==)
break; //输出
printf("%c%d",table[temp].ch,table[temp].num);
printf("\n");
q1.str[q1.pop]='\0';
printf("%d\t",++total);
for(int k=;k<q1.pop;k++)
{
printf("%d",q1.data[k]);
}
printf("\t");
printf("%s\t",q1.str);
for(k=i;k<strlen(ch);k++)
printf("%c",ch[k]);
printf("\t");
}
return ;
} int function(int a,char c,int temp)
{ temp=q1.data[q1.pop-]*+a;
if(table[temp].ch=='s')
{
q1.data[q1.pop]=table[temp].num;
q1.str[q1.pop++]=c;
i++;
}
if(table[temp].ch=='r')
{
if(table[temp].num == )
{
int leag,flag;
q1.pop=q1.pop-;
q1.str[q1.pop]='E';
leag=q1.data[q1.pop-]*+;
q1.data[q1.pop]=table[leag].num;
q1.pop++;
}
else if(table[temp].num == )
{
int leag,flag;
q1.pop=q1.pop-;
q1.str[q1.pop]='E';
leag=q1.data[q1.pop-]*+;
q1.data[q1.pop]=table[leag].num;
q1.pop++;
}
else if(table[temp].num == )
{
int leag,flag;
q1.pop=q1.pop-;
q1.str[q1.pop]='T';
leag=q1.data[q1.pop-]*+;
q1.data[q1.pop]=table[leag].num;
q1.pop++;
}
else if(table[temp].num == )
{
int leag,flag;
q1.pop=q1.pop-;
q1.str[q1.pop]='T';
leag=q1.data[q1.pop-]*+;
q1.data[q1.pop]=table[leag].num;
q1.pop++;
}
else if(table[temp].num == )
{
int leag,flag;
q1.pop=q1.pop-;
q1.str[q1.pop]='F';
leag=q1.data[q1.pop-]*+;
q1.data[q1.pop]=table[leag].num;
q1.pop++;
}
else if(table[temp].num == )
{
int leag,flag;
q1.pop=q1.pop-;
q1.str[q1.pop]='F';
leag=q1.data[q1.pop-]*+;
q1.data[q1.pop]=table[leag].num;
q1.pop++;
}
else
{
printf("出错\n");
return ;
}
}
if(table[temp].ch=='a')
{
printf("接受!\n");
return ;
}
return ;
}

LR(0)语法分析的更多相关文章

  1. C# 语法分析器(二)LR(0) 语法分析

    系列导航 (一)语法分析介绍 (二)LR(0) 语法分析 (三)LALR 语法分析 (四)二义性文法 (五)错误恢复 (六)构造语法分析器 首先,需要介绍下 LALR 语法分析的基础:LR(0) 语法 ...

  2. LL(1),LR(0),SLR(1),LR(1),LALR(1)的 联系与区别

    一:LR(0),SLR(1),规范LR(1),LALR(1)的关系     首先LL(1)分析法是自上而下的分析法.LR(0),LR(1),SLR(1),LALR(1)是自下而上的分析法.       ...

  3. LL(1),LR(0),SLR(1),LALR(1),LR(1)对比与分析

    前言:考虑到这几种文法如果把具体内容讲下来肯定篇幅太长,而且繁多的符号对初学者肯定是极不友好的,而且我相信看这篇博客的人已经对这几个文法已经有所了解了,本篇博客的内容只是对 这几个文法做一下对比,加深 ...

  4. LR(0)文法项目集规范族、DFA和分析表的构建实例

    最近在复习编译原理,考试之前以为自己懂了,眼高手低就没去实践.结果一考试出问题了.... 学习就要脚踏实地,容不得半点模糊.凭着侥幸心理很危险的.以后要引以为戒啊. 特别写出这篇文章 :一来总结一下这 ...

  5. 编译原理根据项目集规范族构造LR(0)分析表

    转载于https://blog.csdn.net/Johan_Joe_King/article/details/79058597?utm_medium=distribute.pc_relevant.n ...

  6. 编译原理LR(0)项目集规范族的构造详解

    转载于https://blog.csdn.net/johan_joe_king/article/details/79051993#comments 学编译原理的时候,感觉什么LL(1).LR(0).S ...

  7. 求LR(0)文法的规范族集和ACTION表、GOTO表的构造算法

    原理 数据结构 // GO private static Map<Map<Integer,String>,Integer> GO = new HashMap<Map< ...

  8. LR(1)表驱动语法分析程序

    /* * LR(1) 语法分析 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #inc ...

  9. 编译原理-第四章 语法分析-4.6 简单LR技术

    简单LR分析方法 一.LR语言分析器模型与算法 1.输入.输出.栈和方法 2.LR语法分析表 3.LR分析程序 4.例 例1: 例2: 二.LR语法分析算法 1.LR语法分析算法的定义和概念 定义: ...

随机推荐

  1. 转: 关于 ssl的建立链接的过程

    转自:  http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html SSL/TLS协议运行机制的概述   作者: 阮一峰 日期: 2014年2月 5日 互 ...

  2. 分页控件(PageControl)的相关属性说明

    UIPageControl *pageControl = [[UIPageControl alloc] init]; pageControl.center = CGPointMake(w * ); p ...

  3. html&css静态页面

    状态不好,整晚未眠. 想着敲点代码,遇着复杂的又自己生气,所以就敲了博客园的,总是很纠结"哪样的文字算标题算段落或要用span""什么时候用div比较好"&qu ...

  4. 转:C# Autocad 关闭所有有色斑的图层

    /*关闭所有有色斑的图层 *  * 色斑图层比较多的情况下,一个一个弄比较麻烦,这个一次全关,再配合图层状态保存功能就非常容易相互切换了 *  * http://goat.cublog.cn * 作者 ...

  5. Linux下向SVN服务器添加新文件步骤

    1.将文件checkout到本地目录 svn checkout path(path是服务器上的目录)   例如:svn checkout svn://192.168.1.1/pro/domain    ...

  6. ViewPager 可左右滑动和缩放的图片浏览

    最近因为要做一个项目,需要使用到图片的浏览.我就自己在网上找了些资料,然后加以修改整理后出来一个demo,希望可以帮助到需要的人.同时这也是我第一个技术博客. 在做之前首先需要了解一下什么是ViewP ...

  7. (火炬)MS SQL Server数据库案例教程

    (火炬)MS SQL Server数据库案例教程 创建数据库: CREATE DATABASE TDB //数据库名称 ON ( NAME=TDB_dat,//逻辑文件名 在创建数据库完成之后语句中引 ...

  8. linux中mail函数不能发送邮件

    没有安装或启动 sendmail 组件 解决办法 我是新手,命令不熟,所以写的很详细,老鸟勿喷哦 1.重新安装 sendmail 组件,我用的是 CentOS ,使用下面的命令安装 代码如下 复制代码 ...

  9. Exchange之三合一部署

          1.         前期准备条件之安装filter包   2.         前期准备之安装组件,命令如下 Add-WindowsFeature NET-Framework,RSAT- ...

  10. server——小记

    问题 Step 1   Start the server in Directory Services Restore Mode   Windows Server 2003/2008 Directory ...