编译原理实验四——实现LR分析器模型的总控程序
一 LR分析器模型
二.具体动作
(1)移进【shift】
若ACTION[Si,a]=Sj,a为终结符,则把a移入文法符号栈,Sj移入状态栈;
(2)归约【reduce】
若ACTION[Si,a]=rj,a为终结符或#,则用第j个产生式(A->β)归约,将两个栈弹出∣β∣个元素,这时当前面临符号为第j个产生式左部的非终结符(A);若状态栈当前的栈顶状态为Sk,且GOTO[Sk,A]=j,则非终结符A移入符号栈,j移入状态栈;
(3)接受【accept】
若ACTION[Si,a]=acc,a为#,则为接受,表明分析成功;
(4)报错【error】
若ACTION[Si,a]=空白,则转向出错处理。
三.总控程序算法逻辑
四 总控程序代码
#include <iostream>
#include <stack>
#include <string>
#include <map>
#include <typeinfo>
#include <vector>
using namespace std;
/*
(0)E -> S
(1)S -> BB
(2)B -> aB
(3)B -> b
*/
stack<int> stateStack;//状态栈
stack<char> signStack;//符号栈
string inputS; //输入串
map<int, map<char, string> > ACTION = {
{
0,{
{
'a',"s3"},{
'b',"s4"},{
'#'," " }}},
{
1,{
{
'a'," " },{
'b'," " },{
'#',"acc"}}},
{
2,{
{
'a',"s3"},{
'b',"s4"},{
'#'," " }}},
{
3,{
{
'a',"s3"},{
'b',"s4"},{
'#'," " }}},
{
4<