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

/*
* LR(1) 语法分析
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h> #include "Common.h"
#include "LRCal.h"
#include "LRMigrate.h"
#include "Stack.h" #define NEXTWORD(s) ((*(s)==0)?SYM_EOF:*((s)++)) extern char *Grammer[]; void LRParse(struct LRElement **LRTable, unsigned char *InputString)
{
printf("-------- Parse --------\n");
struct Stack *SymbolStack = BuildStack();
Push(SymbolStack, ); // push $;
Push(SymbolStack, ); // push start state s0;
int Word = NEXTWORD(InputString); // word <- NextWord();
int State = ;
while (true) // while (true)
{
State = Top(SymbolStack); // state <- top of stack;
printf("State: %d\tWord: %c \t", State, Word);
if (LRTable[State][Word].Action == Reduce) // if (Action[state, word] = "reduce A->β")
{
printf("reduce %d", (int)LRTable[State][Word].ActionValue); char *Production = Grammer[LRTable[State][Word].ActionValue - ];
int ProductSize = strlen(Production) - ;
// pop 2*|β| symbols;
ProductSize *= ;
while (ProductSize--)
{
Pop(SymbolStack);
}
// state <- top of stack;
State = Top(SymbolStack);
// push A;
int LeftUnterminal = (int)Production[];
Push(SymbolStack, LeftUnterminal);
// push Goto[State, A];
Push(SymbolStack, (int)LRTable[State][LeftUnterminal].ActionValue);
}
else if (LRTable[State][Word].Action == Shift) // else if (Action[state, word] = "shift si")
{
printf("shift %d", (int)LRTable[State][Word].ActionValue);
// push word;
Push(SymbolStack, Word);
// push si;
Push(SymbolStack, LRTable[State][Word].ActionValue);
// word <- NextWord();
Word = NEXTWORD(InputString);
}
else if (LRTable[State][Word].Action == Accept) // else if (Action[state, word] = "accept")
{
printf("accept\n");
break;
}
else
{
printf("Syntax Error!\n");
exit();
}
printf("\n");
}
printf("Grammer Parse Success!\n");
}
全部代码文件:http://files.cnblogs.com/rexfield/LR.zip
LR(1)表驱动语法分析程序的更多相关文章
- LR(1)表驱动语法分析设计图表
- Tomcat内核之ASCII解码的表驱动模式
我们知道Tomcat通信是建立在Socket的基础上,而套接字在服务器端和客户端传递的报文都是未经过编码的字节流,每8位组成1个字节,计算机以二进制为基础,这是由于使用晶体管的开合状态表示1和0,这样 ...
- 表驱动方法(Table-Driven Methods)
表驱动方法(Table-Driven Methods) - winner_0715 - 博客园 https://www.cnblogs.com/winner-0715/p/9382048.html W ...
- Table-Driven Design 表驱动设计
注:本文所有代码来自 http://www.codeproject.com/Articles/42732/Table-driven-Approach 在许多程序中,经常需要处理那些拥有种种色色不同特性 ...
- Mysql优化原则_小表驱动大表IN和EXISTS的合理利用
//假设一个for循环 ; $i < ; $i++) { ; $i < ; $j++) { } } ; $i < ; $i++) { ; $i < ; $j++) { } } ...
- 如何使用Microsoft的驱动程序验证程序解释无法分析的崩溃转储文件
这篇文章解释了如何使用驱动程序验证工具来分析崩溃转储文件. 使用Microsoft驱动程序验证工具 如果您曾经使用Windows的调试工具来分析崩溃转储,那么毫无疑问,您已经使用WinDbg打开了一个 ...
- html表单验证程序
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- LR(1)表生成算法演示程序
/* * LR 转换表 * + Goto 记录表 * + 状态转换表 */ #include <stdio.h> #include <stdlib.h> #include &l ...
- [lua]原来这才是表驱动的正确表达方式
曾经写了个很煞笔的脚本模拟switch..case语法形式.[lua]尝试一种Case语法糖 而今实际项目应用中突发,原来这才是正确的表驱动方式表达.如下所贴: function event_do( ...
随机推荐
- .net闭包的应用
这里体现出闭包的数据共享 , , , , , , , , , }; ; ; values.ToList().ForEach(s => result1 += s); values.ToList() ...
- centos VM 识别U盘
在VM设置选项中,选择 USB Controller 选项,设置相关参数即可
- Android中图片的异步加载
转: 1. 为什么要异步加载图片 下载图片比较费时,先显示文字部分,让加载图片的过程在后台,以提升用户体验 2. SoftReference的作用 栈内存—引用 堆内存—对象 Eg: Object ...
- DevExpress控件-- Gridcontrol合并表头
写在前面的话: 在园子里逛了有一段时间了,一直想写点东西,但苦于自己的水平有限,生怕写出来的东西浪费了读者的时间.楼主有幸参加了公司DevExpress控件的培训,独乐乐不如众乐乐,特附上Demo以飨 ...
- HTML块
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- workerman安装
1.workerman安装 workerman是php的一个socket框架,简化了socket编程,已经为很多企业所用,今天在centos的ngix+php下安装了workerman,过程记录如下. ...
- centos系统使用技巧
===============================网络配置===============================1 eth0 接口配置:/etc/sysconfig/network ...
- c/c++ 传统数组的缺点
专题: 动态内存分配 (所有高级语言,没有C里深刻) 传统数组的缺点: 1.数组长度必须事先指定,而且只能是常整数,不能是变量 例子 ]; //必须事先指定,而且只能是常整数 ; int a ...
- python中的__init__ 、__new__、__call__等内置函数的剖析
1.__new__(cls, *args, **kwargs) 创建对象时调用,返回当前对象的一个实例;注意:这里的第一个参数是cls即class本身2.__init__(self, *args, ...
- [原博客] POJ 1067 取石子游戏
题目链接有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后把石子全部取完者 ...