# 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. 触发器修改后保存之前的数据 表中插入数据时ID自动增长

    create or replace trigger t before update on test5 for each rowbegin insert into test55 values (:old ...

  2. 转 【O2O案例】汽车后市场垂直化电子商务:平业模式解析

    核心提示:一.商业模式简介.汽车后市场垂直化电子商务是我在2010年初开始筹划,起因是在淘宝工作期间运营汽车类目后遇到很多问题无决,由于 一.商业模式简介. 汽车后市场垂直化电子商务是我在2010年初 ...

  3. DIV+CSS解决IE6,IE7,IE8,FF兼容问题

    1.IE8下兼容问题,这个最好处理,转化成IE7兼容就可以.在头部加如下一段代码,然后只要在IE7下兼容了,IE8下面也就兼容了:1. <metahttp-equivmetahttp-equiv ...

  4. 配置JDK和TOMCAT

    配置JDK 1.先从官网下载最新的JDK安装包,然后安装.安装过程中会询问是否再装JRE,因为JDK中已经包含JRE,所以不必重复安装. 2.注意安装的路径名最好不要有中文或者空格出现. 3.在系统环 ...

  5. [转]GCC参数详解

    [介绍] gcc and g++分别是gnu的c & c++编译器 gcc/g++在执行编译工作的时候,总共需要4步 1.预处理,生成.i的文件[预处理器cpp] 2.将预处理后的文件不转换成 ...

  6. 使用SQLite3持久保存应用程序数据

    前言 SQL是一种数据库查询语言,用于存取数据以及查询.更新和管理关系数据库系统,因为强大的查询功能和简单的语法,已经成为主流数据库的标准语言.SQLite3是一种嵌入式的数据库,无需服务器支持,它将 ...

  7. 20141211—C#面向对象,封装

    封装 一个private 的变量.在变量名上右键-重构-封装字段 小建议:在创建封装字段的时候,在名字前加 “_”用以区分. 封装时,下划线会自动去除 点击确定后: 应用: 赋值的时候走 set 取值 ...

  8. 【风马一族_Android】适合你 --- 大概的描述

    适合你:专注于解决毕业生,离校所遗留的闲置教材的去向问题的一款APP. 目前的现状:毕业生的闲置教材,被清理宿舍的阿姨.大叔所清理到垃圾场,或拿到收破烂的地方,卖掉. 在毕业季中,存在的闲置物品不只有 ...

  9. C++实现设计模式之 — 简单工厂模式

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4251756.html 所谓简单工厂模式,是一种实例化对象的方式,只要输入需要实例化对象的名字 ...

  10. 9更令人兴奋的WebGL演示

    Firefox OS,asm.js和推动浏览器性能改进,画布和WebGL技术是打开一个世界的可能性.我上9令人兴奋的帆布演示,然后把它与9 WebGL演示,但我想超越这篇文章.我发现9个更多的精神We ...