LR(0)分析表的构建

您所在的位置:网站首页 预测分析表编译原理图 LR(0)分析表的构建

LR(0)分析表的构建

2024-07-12 06:02| 来源: 网络整理| 查看: 265

LR(0)分析表的构建 一、实验要求

构建LR(0)分析表 例: G[E]: E->aA E->bB A->cA A->d B->cB B->d

二、实验原理

在网上找了好久,发现大多数都是概念和复杂公式, 因此为了使大家能够更好的理解LR(0)分析表的构建,我准备举一个例子进行详细解析,一步步进行分析,直到最后画出分析表。 文法: E->aA E->bB A->cA A->d B->cB B->d

给初始符再构建一个初始符E’->E(I0)为该初始符加上 . . .,变成E’->.E查看小圆点后字符是否为非终结符,是,将左部为该非终结符的文法加入其中,并为其添加小圆点;反之进行下一步。(I0变成E’->.E E->.aA E->.bB)对I项目中的文法进行分析,若小圆点在最后,则不做处理;若小圆点不在最后,则将根据每个文法的小圆点后的字符来开辟出新的I项目,该文法为新项目的首句文法(I0的文法进行开辟,I0不变,生成I1、I2和I3,I1:E’>.E I2:E->.aA I3:E->.bB),然后将新开辟项目的文法小圆点向后移一位(I1:E’>E. I2:E->a.A I3:E->b.B)。注:若开辟的项目和重复,则不进行开辟,再次利用已存在的项目)对开辟的项目重复3-4步骤,直到不再有项目开辟 具体结果请见下图

在这里插入图片描述

6.然后根据上图,构建出相应的分析表 在这里插入图片描述

三、算法设计 设计字符串存储文法,采用结构体存储生成的项目以及项目的去向为项目0赋予新的初始符,并添加小圆点判断小圆点后的字符: 若为终结符,进行下一步;若为非终结符,将该非终结符为左部的文法加入该项目当中,并为其添加小圆点。判断小圆点位置: 若在该句文法最后,则进行下一步;反之,开辟新的项目,该句文法为新项目的首句文法,并将新项目文法的小圆点后移一位 注:若开辟的项目中文法和已有的项目重复,则该文法不进行开辟,再次利用已存在的项目。重复执行3-4,直到不再有新的空间开辟出来。 四、模块设计 变量定义 char str[10][10];//存储文法 int n;//存储文法行数 int v=0;//存储生成项的个数 char r[20][10];//存储分析表的float值 int rr[20][10];//存储分析表的int值 struct DFA{ int num;//记录生成项的序号 int c[10];//存储该项目各个文法的去向(子代) int f;//记录该项目的来源(父代) char ss[10][10];//存储该项的文法 int count;//记录该项的文法行数 int l;//存储第一行字符串'.'的位置 }LR[20]; 输入模块 从键盘输入上下文无关文法,存储到char类型的字符串数组当中 //初始化,输入上下文无关文法,以#号结尾 void Init(){ int i,j; cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3