【20200429】编译原理课程课业打卡十九之判断OPG文法求解句子分析过程
【20200429】编译原理课程课业打卡十九之判断OPG文法&求解句子分析过程
- 一、课业打卡十九之判断OPG文法&求解句子分析过程
- 二、知识巩固
- 1、判断OPG文法
- 2、求算符优先函数的方法—迭代法
- 3、求算符优先函数实例&代码实现
- 4、算符优先分析法实例讲解
叮嘟!这里是小啊呜的学习课程资料整理。好记性不如烂笔头,今天也是努力进步的一天。一起加油进阶吧!
一、课业打卡十九之判断OPG文法&求解句子分析过程
问题描述:
已知文法:
S->V
V->T|ViT
T->F|T+F
F->)V*|((1)(+(i( 的规范推导。
(2)F+Fi( 短语、句柄和素短语。
(3)判断文法是否为OPG,若是,则给出(1)的分析过程。
题目解析:
(1)(+(i( 的规范推导。
(2)F+Fi( 短语、句柄和素短语。
(3)判断文法是否为OPG,若是,则给出(1)的分析过程。
二、知识巩固
1、判断OPG文法
自底向上算符优先分析法(OPG)
它只考虑算符(终结符)之间的优先关系,分析扫描每个规约式的算符间优先关系。
算符文法:
即它的任一产生式的右部都不含两个相继的非终结符的文法。
如果G是一个不含空字符的算法文法,那么只要它的任一对终结符都至多只满足>,=,<的关系的其中一种,则称g是一个算符优先文法。
假定G是一个**不含空字符产生式**的算符文法。对于任何一对终结符a,b,(1)a=b,当且仅当G中含有形如P->…ab…或P->…aQb…的产生式;(2)a<b, 当且仅当G中含有形如P->…aR…的产生式,而R-〉b…或R->Qb…;(3)a>b, 当且仅当G中含有形如P->…Rb…的产生式,而R->…a或R->…aQ;
【注:a<b不等价于b>a! 这里的等号左右顺序指明的是式子中这两个终结符的左右顺序。
实际上,这里的大小关系就是先后规约的优先级关系】
需要解决的几个问题
(1)构造Firstvt以及Lastvt集
(2)构造优先关系表
2、求算符优先函数的方法—迭代法
若已知运算符之间的优先关系,可按如下步骤构造优先函数:
1、对每个运算符a(包括#在内)令f(a)=g(a)=12、如果a⋗b且f(a)<=g(b)令f(a)=g(b)+13、如果a⋖b且f(a)>=g(b)令g(b)= f(a)+14、如果a≐b而f(a) ≠g(b),令min{f(a),g(b)}=max{f(a),g(b)}5、重复2~4,直到过程收敛。如果重复过程中有一个值大于2n,则表明不存在算符优先函数。
3、求算符优先函数实例&代码实现
程序实现代码为:
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 100
#define MaxOp 9struct
{char ch; //运算符int pri; //优先级}lpri[]={{'+',1},{'-',1},{'*',1},{'/',1},{'(',1},{')',1},{'#',1}},rpri[]={{'+',1},{'-',1},{'*',1},{'/',1},{'(',1},{')',1},{'#',1}};int f(char op) //求左运算符op的优先级
{int i;for (i=0;i<MaxOp;i++)if (lpri[i].ch==op) return lpri[i].pri;
}int g(char op) //求右运算符op的优先级
{int i;for (i=0;i<MaxOp;i++)if (rpri[i].ch==op) return rpri[i].pri;
}char Precede(char c1,char c2)
{int i=0,j=0;static char array[49]={'>', '>', '<', '<', '<', '>', '>','>', '>', '<', '<', '<', '>', '>','>', '>', '>', '>', '<', '>', '>','>', '>', '>', '>', '<', '>', '>','<', '<', '<', '<', '<', '=', '!','>', '>', '>', '>', '!', '>', '>','<', '<', '<', '<', '<', '!', '='};switch(c1){case '+' : i=0;break;case '-' : i=1;break;case '*' : i=2;break;case '/' : i=3;break;case '(' : i=4;break;case ')' : i=5;break;case '#' : i=6;break;}switch(c2){case '+' : j=0;break;case '-' : j=1;break;case '*' : j=2;break;case '/' : j=3;break;case '(' : j=4;break;case ')' : j=5;break;case '#' : j=6;break;}return (array[7*i+j]);}
void main()
{int i,j,k=1;while(k!=0){k=0;for(i=0;i<7;i++){for(j=0;j<7;j++){if(Precede(lpri[i].ch,rpri[j].ch)=='>'&&f(lpri[i].ch)<=g(rpri[j].ch)){ lpri[i].pri=rpri[j].pri+1;k=1;}else if(Precede(lpri[i].ch,rpri[j].ch)=='<'&&f(lpri[i].ch)>=g(rpri[j].ch)){ rpri[j].pri=lpri[i].pri+1;k=1;}}}}printf(" ");for(i=0;i<7;i++)printf("<",lpri[i].ch);printf("\n");printf("入栈优先函数f:");for(i=0;i<7;i++)printf("=",lpri[i].pri);printf("\n");printf("比较优先函数g:");for(i=0;i<7;i++)printf("=",rpri[i].pri);printf("\n");
}
4、算符优先分析法实例讲解
Ending!
更多课程知识学习记录随后再来吧!
就酱,嘎啦!
注:
1、人生在勤,不索何获。
2、编译原理之求算符优先函数的方法—迭代法参见文章:
编译原理之求算符优先函数的方法—迭代法
3、编译原理学习笔记·语法分析(LL(1)分析法/算符优先分析法OPG)及例子详解参见文章:https://www.cnblogs.com/zhouie/p/8955802.html
【20200429】编译原理课程课业打卡十九之判断OPG文法求解句子分析过程相关推荐
- 【20200422】编译原理课程课业打卡十七之求解文法FirstVTLastVT构造文法算符优先关系表
[20200422]编译原理课程课业打卡十七之求解文法FirstVT&LastVT&构造文法算符优先关系表 一.课业打卡十七之求解文法FirstVT&LastVT&构造 ...
- 编译原理学习笔记(二十九)~习题:分析句子 id--id*id的 最右推导过程,画出分析树,找出和分析过程中每一步的对应关系。
题目 分析句子 id–id*id的 最右推导过程,画出分析树,找出和分析过程中每一步的对应关系. 语法如下: E → E - T (1) E → T (2) T → T * F (3) T → F(4 ...
- 国内外编译原理课程实践教学现状分析
<自己动手写编译器.链接器> 冯向萍 (新疆农业大学计算机与信息工程学院) 摘 要:本文主要从教材的选择,实践项目的设置以及实践课程占总评成绩的比例等方面分析和比较了国内外多所高校编译 ...
- PL/0语言编译器扩展 编译原理课程实践(1)
转眼大学生活就要结束,编译原理课程学的东西很多都忘记了.当时我们编译原理课程实践是PL/0语言编译器扩展,在原有PL/0语言文法进行扩展.我写这次博文一是为了回忆以前学的知识,加深记忆:二是和大家分享 ...
- 编译原理课程作业-Cminus语言的词法及语法分析器实现
Cminus Compiler 编译原理课程作业-Cminus语言的词法及语法分析器实现 设计思想 词法分析 使用确定有限态自动机(DFA)实现与Lex自动分析两种方式实现. 语法分析 使用递归下降方 ...
- lr1分析器c语言实验报告怎么写,编译原理课程的设计构造LR分析法语法分析器.doc...
编译原理课程的设计构造LR分析法语法分析器 太 原 学 院 课程设计报告书 课程名称 设计题目 构造LR(0)分析法语法分析器 专业班级 学 号 姓 名 指导教师 2016年 12 月 15日 目 录 ...
- 编译原理课程设计-对pl0语言进行扩充
文章目录 一. 设计目的及要求 1.1 设计目的 1.2 设计要求 1.2.1 要求一 1.2.2 要求二 1.2.3 要求三 二.程序设计 2.1 程序的组织结构 2.1.1 PL/0编译程序函数定 ...
- 编译原理课程实践——实现一个初等函数运算语言的解释器或编译器
编译原理课程实践--实现具有初等函数运算语言的解释器或编译器 作者:Sylvan Ding |转载请注明文章出处! 摘要:本文主要内容是设计词法分析器.语法分析器(LL(1).SLR(1))和语义分析 ...
- 【编译原理】Compiler_Stanford University 编译原理课程地址
课程简介 编译原理课程作为计算机专业本科生的必修课,能够使学生们增加对编译过程的了解.因为想加深对编译器的了解和实现一个简单的编译器,所以我找到了该课程,通过阅读该课程的简介,觉得该课程还是十分不错的 ...
最新文章
- 解决了无法显示验证码的问题
- YYModel 源码解读(二)之YYClassInfo.h (1)
- 数据库服务器的文件结构6,以下数据库服务器的文件结构
- nssl1218-TRAVEL【SPFA】
- ADO.NET实例教学一
- 解决php使用ZipArchive解压时中文乱码问题(纯php,绕开ZipArchive)
- 计算机安装win10配置,安装Win10系统配置的最低要求
- uni-app引入阿里云矢量图标库
- avc 转 hevc
- stm32f401RET6 时钟配置
- opencv部署onnx,并对jpg图片进行批量检测生成xml重要信息
- appcan ajax mysql_appCan折叠列表
- STM32——EMWIN JPEG 图片显示(二十三)
- 文字转语音软件哪个好?快把这些软件收好
- Numpy中矩阵向量乘法np.dot()及np.multiply()以及*区别
- java.net.UnknownHostException: localhsot
- Jetson Xavier NX 套件将系统装到SSD
- 2021年9月PMP考试新鲜出炉,如何查询成绩?
- Python爬虫爬取表情包
- Web前端之HTML 与 CSS基础知识