LR语法分析
LR简要的介绍:
LR分析是一种自底向上的进行规范规约的语法分析方法,L:自左向右扫描R:自底向上的进行规约。
实验原理:
LR分析器基本思想:
1-记住历史--记住已经移进和规约整个符号串
2-展望未来--根据产生式推测未来可能遇到的输入符号
3-认情现实--根据现实所输入的字符串确定栈顶符号是否构成产生式的句柄
LR分析表是 LR分析器核心分, 包括一张ACTION 和GOTO表。
具有移进、规约、接受、报错 4个动作
本实验的的文法是G[E]:E->E+E | E*E | (E) | i , 基于编译原理教材的P90 表3.21 如图:
代码:
#if 1
/*
作者:何文官
SLR(1)来源:编译原理 第三版 P90 表3.21
BUG 已经解决;
总结:规约:1-符号栈 POP(原来栈顶符号) PUSH(规约的左部)
2-状态栈 POP(当前的栈顶符号) 规约几个右部就POP几个
3-新的状态 = 查GOTO(状态栈顶,符号栈顶的元素)
4-PUSH(新状态)
移进:1- 新状态 = 查表ACTIONG(当前状态栈顶,输入串)
2- 状态栈 PUSH(新状态)
3- 符号栈 PUSH(输入串当前字符)
*/
#include<iostream>
#include<malloc.h>
using namespace std;
int action[10][7]={ //ACTION 的二维数组
{ 3 , -1 , -1 , 2 , -1 , -1 , 1 },
{-1 , 4 , 5 , -1 , -1 , 44 , -1 },
{ 3 , -1 , -1 , 2 , -1 , -1 , 6 },
{ -1 , 104 , 104 , -1 , 104 , 104 , -1 },
{ 3 , -1 , -1 , 2 , -1 , -1 , 7 },
{ 3 , -1 , -1 , 2 , -1