# 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. 转:YUV RGB 常见视频格式解析

    转: http://www.cnblogs.com/qinjunni/archive/2012/02/23/2364446.html YUV RGB 常见视频格式解析 I420是YUV格式的一种,而Y ...

  2. 【转载】从 LinkedIn 的数据处理机制学习数据架构

    http://www.36dsj.com/archives/40584 译者:伯乐在线-塔塔 网址:http://blog.jobbole.com/69344/ LinkedIn是当今最流行的专业社交 ...

  3. CPU 硬盘性能到底相差多少

    本文以一个现代的.实际的个人电脑为对象,分析其中CPU(Intel Core 2 Duo 3.0GHz)以及各类子系统的运行速度——延迟和数据吞吐量.通过粗略的估算PC各个组件的相对运行速度,希望能给 ...

  4. Android之开源项目工具库篇

    本文转自:http://www.trinea.cn/android/android-open-source-projects-dev-lib/ 本文中你可以找到那些精美App中各种有特性的View,如 ...

  5. 各个手机APP客户端内置浏览器useragent

    手机QQ Mozilla/5.0 (Linux; Android 4.4.2; GT-I9500 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko ...

  6. sql获取时间时分秒

    select datename(hour,getdate())+':'+datename(minute,getdate())+':'+datename(second,getdate())

  7. 《Cocos2d-x实战 工具卷》上线了

    感谢大家一直以来的支持! 各大商店均开始销售:京东:http://item.jd.com/11659696.html当当:http://product.dangdang.com/23659809.ht ...

  8. 【学习笔记】【C语言】逻辑运算符

    有时候,我们需要在多个条件同时成立的时候才能执行某段代码,比如:用户只有同时输入了QQ和密码,才能执行登录代码,如果只输入了QQ或者只输入了密码,就不能执行登录代码.这种情况下,我们就要借助于C语言提 ...

  9. OC1-XML文件解析

    <?xml version = "1.0" encoding="utf-8"?> <Users> <User id="0 ...

  10. ListBox复选框拓展

    Toolkit的LongListMutiSelector的复选框功能,想必许多人都需要吧!然而系统本身控件ListBox虽然也有多选功能,可是外观上却缺乏复选框,选择效果只是颜色变化.于是在上一个项目 ...