编译原理——自上而下语法分析
自上而下分析面临的问题
回溯 (当候选有多个的时候,匹配失败会造成回溯)
文法左递归问题
那么他这个语法树就会无限增长但是分析并没有继续进行下去,就会导致分析进入死循环中
LL1文法消除左递归
消除直接左递归
思想就是把左递归变成右递归
消除间接左递归
你看,上面消除间接左递归的过程就是把R带入Q中的推导,再把新得到的Q的推导带入S的推导中去,然后我们就得到了直接左递归,然后就可以使用之前的方法来消除左递归了,这样我们就打破了S的左递归,同样的我们也打破了 Q 和 R 的左递归
我们下面的算法就是应用这样的思想来计算的
下面给出一个消除左递归的算法(可以消除直接左递归和间接左递归):
但是这个算法有两个条件:
不含有空产生式
不含有回路
消除回溯
First集合
一个文法一开始可能并不存在每个非终结符的首符集两两不相交的情况,我们可以通过一个算法,把这个文法改造成两两不相交,这个算法叫做提取公共左因子
但是这个算法对绝大多数文法是能变成两两不相交的,但是也存在某些文法,他就是无法变成两两不相交的
Follow集合
只用当A -> 空 的时候才会用到 Follow 集合, 否则,如果A不能推出空的, 那么轮到A匹配的时候,要么就A匹配成功,要么匹配失败,不可能有A之后字符的事
LL1文法
递归下降分析器
比如:A的程序就会依次调用B和D的程序进行语法分析
ADVANCE就相当于词法分析的子程序,当这个程序执行完后,就会把识别的词放到变量SYM当中去
扩充的巴克斯范式和语法图
α是个字符串
预测分析程序
预测分析程序就是采用非递归的方法实现递归下降程序
预测分析表是个二维矩阵,用于指导语法分析,表示栈顶符号是 A 时 , 面临非终结符a时应该采取的动作,用哪个候选进行扩展
预测分析表的构造
构造分析表说白了就是把每一个非终结符的每一个候选放到在表中合适的位置上去
分析表就是告诉你当非终结符 A 面临终结符a 时应该选择哪个候选式进行扩展
对于 A -> a 一定是放到 A 的那一行, 然后 First(a) 的那一列上
对于 A-> 空 一定是放到 A 的那一行, 然后 Follow(A) 的那一列上
LL1文法与二义性
如果G是左递归或者二义的,那么构造出的预测分析表的某一个格子中一定会有多个候选(也就是M含有多重定义入口的意思),如果一个格子里有多个候选,就会给分析带来不确定
但是,并不是所有的文法经过消除左递归和提取左公共因子都可以变得无二义,比如说下面这个文法
那么导致这种二义性出现的原因就是 那个 else 和 if then 匹配的问题
你可以理解为else 和就近的 if then 匹配 也可以理解为 else 和 远处的 if then 匹配
这种问题称为 悬挂else问题
所以说描述 if else 的文法是二义的
编译原理——自上而下语法分析相关推荐
- 编译原理——自上而下的语法分析方法(LL分析法)
自上而下的语法分析方法(LL分析法) 概述: 语法分析的地位:编译程序的核心部分 任务:词法分析出来的单词序列是否是给定文法的句子 理论:上下文无关文法和下推自动机 方式:自上而下的语法分析(推导)和 ...
- 编译原理——自上而下的语法分析
语法分析的功能: 语法分析方法的分类: (1)自上而下(自顶而下)分析法:从开始符号出发,进行最左推导,或从根开始,构造推导树.(回溯分析法属于不确定的自上而下的语法分析方法,而递归下降分析法和预测 ...
- 编译原理2-Bison语法分析
ps:补上了图 实验要求 了解 Bison 基础知识和理解 Cminus-f 语法(重在了解如何将⽂法产⽣式转换为 Bison 语句) 阅读 /src/common/SyntaxTree.c ,对应头 ...
- 编译原理之语法分析(自底向上)(包含源码)
编译器之语法分析 自底向上 基本概念 算符优先 SLR 规范LR LALR 自底向上 基本概念 自底向上形成语法树的过程就是及逆行归约,将一堆单词串放在一起,形成某个产生式的样子,然后规约成某个产生式 ...
- 编译原理之语法分析(预测分析法)
编译器之语法分析 自顶向下 上下文无关文法 语法树 NFA→CFG 预测分析法 改写CFG 原因 消除二义性 消除左递归 消除左公因子 消除空产生式 消除回路 自顶向下 上下文无关文法 CFG本质上就 ...
- 编译原理词/语法分析
效果: 代码: 1: using System; 2: using System.Collections.Generic; 3: using System.ComponentModel; 4: usi ...
- 计算机语法分析,电子科技大学-计算机学院-编译原理实验-语法分析.pdf
// SyntaxAnalyzer.cpp : 定义控制台应用程序的入口点. // #include #include #include #define MAX_COUNT 1024 #define ...
- 【编译原理】Python语法分析LL(1)、LR(1)
目录 一.实验目的 二.实验任务 三.实验原理 1 LL(1)文法 2 LR文法 四.实验过程 1 LL(1)文法 2 LR文法 五.实验结果 1 LL(1)文法 2 LR(0)文法 3 ...
- [编译原理]DO-WHILE循环语句的翻译程序设计(LR(1)方法、输出四元式)C++实现
题目: DO-WHILE循环语句的翻译程序设计(LR(1)方法.输出四元式) 1 课设任务概述 初始条件: 理论:完成编译原理,数据结构.高级编程语言.汇编语言等相关课程的学习,基于计算机专业知识 ...
最新文章
- bo dto java vo_java中PO、VO、BO、POJO、DAO、DTO、TO、QO、Bean、conn的理解
- 图片二进制编码_python3从零学习-5.7.4、quopri编码与解码经过MIME转码打印数据
- 如何快速的解决Maven依赖冲突
- mysql门派年龄最大的人_目前活着年龄最大的人
- SpringBoot : 注解@Resource
- 如何在Mac上自定义控制中心
- 完美解决Win8声卡爆音破音、卡顿
- linux从入门到精通张帆,Linux基础之文件系统简介及其系统管理工具
- 小象机器学习(邹博老师)学习笔记
- (EasyX入门与实战)第五章 添加音乐
- 【计算机视觉】 opencv双目视觉 立体视觉 三维重建 之理论篇
- 错误:ctype-stubs_32.a: No such file or directory
- CDP、私域运营及数字营销相关名词一览
- 怎样屏蔽(去掉)csdn博客侧栏广告
- linux系统无线网卡驱动安装,在linux上怎么安装无线网卡驱动?
- net-snmp开发代理常见问题解决方案
- GNS3实验操作(三)
- 服务器断电mysql文件丢失_服务器断电了怎么恢复数据?
- python操作微信自动发消息(微信聊天机器人)
- Python负数除法取余操作
热门文章
- Circular Billiard Table(计算几何)
- 已达到人类水准语音识别模型的whisper,真的有这么厉害吗?
- 漫谈测试成长之探索——测试排期
- css背景渐变(灰色渐变背景)
- 分析nginx日志屏蔽攻击者ip
- Android Service之设备存储空间监控
- Android 调用.so包时报错:UnsatisfiedLinkError: No implementation found for XXX 时的解决办法
- ncbi查找目的基因序列_如何获得基因序列——在NCBI中查找目的基因实例.PDF
- C#开发简单绘图工具
- 基本算法总结,力扣题目整理