编译原理学习之语法分析
1、语法分析的地位
–是编译程序的核心部分。
2、语法分析的任务
–识别由词法分析得出的单词序列是否是给定文法的句子。
3、语法分析的理论基础
–上下文无关文法和下推自动机
4、语法分析的方式
1)自上而下语法分析
•反复使用不同产生式进行推导以谋求与输入符号串相匹配。
2)自下而上语法分析
•对输入符号串寻找不同产生式进行归约直到文法开始符号。
4.1下推自动机(PDA)
1)PDA和FA的模型相比,多了一个下推栈。
2)PDA的动作由三个因素来决定:当前状态、读头所指向符号、下推栈栈顶符号。
3)一个输入串能被PDA所接受,仅当输入串读完,下推栈变空;或输入串读完,控制器到达某些终态。
4)正规文法和有限自动机仅适合于描述和识别高级语言的各类单词,语句可用上下文无关文法来描述,而下推自动机又恰好能识别上下文无关文法所能描述的语言,因此上下文无关文法及其对应的下推自动机就成为编译技术中语法分析的理论基础。
4.2自上而下分析法
1.自上而下语法分析定义
–从文法的开始符号开始,反复使用不同产生式进行推导以谋求与输入符号串相匹配。
2.算法
(1)若栈顶符号x是非终结符,查询语法表,找出一个以x作为左部的产生式,x出栈,并将其右部反序入栈,且输出带记下产生式编号——推导。
(2)若栈顶符号x是终结符,且读头下的符号也是x,则x出栈,读头指向下一个符号——匹配。
(3)若栈顶符号x是终结符,但读头下的符号不是x,则匹配失败。这说明可能前面推导时选错了候选式,退回到上次推导现场(包括栈顶符号、读头的指针和输出带上信息)——回溯。
(4)回溯后选取另一候选式进行推导,若没有候选式可选,则进一步回溯。若回溯到开始符号又已无候选式可选,则识别失败。
(5)若栈内仅剩下“#”,且读头也指向“#”,则识别成功。
3、带回溯的自上而下分析法的缺陷
1)如果文法存在左递归,语法分析会无限循环下去。
–左递归:文法存在产生式P →Pa–直接左递归:P →Pa–间接左递归:P →Aa, A→Pb
2)若产生式存在多个候选式,选择哪个进行推导完全是盲目的。
3)回溯会引起时间和空间的大量消耗。
4)如果被识别的语句是错的,算法无法指出错误的确切位置。(目前的编译器是可以找到确切位置的)
4.消除直接左递归
设有文法G=(VN, VT,P,S),其中产生式P为P →Pα|β, α∈V+,β∈V+且β不以P开头
将它转换为等价式:P →βP’P’→αP’|ε
一般地:
将P →P α1| P α2|…. |P αm|β1| β2|….| βn
转换为:P →β1P| β2p
|……| βnP
| α2P
P’ →α1P|……| αmP
| ε
转换前后等价。因为最终 p=βααααααα。。两种结果一样
例:文法G: (1)E →E+T|T
转化为G:
E
(1) →E →TE→+TE
| ε
就是直接变量代换。
5.消除左递归算法
1)把文法G的所有非终结符按任意顺序排列成P1,P2,…,Pn,然后按此顺序执行步骤2。
2)For (I=1,I<=n,I++)
{for (k=1,k<=I-1,k++)
{把形如Pi→Pkγ的规则改写为
Pi→δ1 γ|δ2 γ|……| δn γ
/* 其中Pk→δ1| δ2|……| δn*/ }
消除Pi规则的直接左递归;}
3)删去从文法开始符号不可达的非终结符产生式。
6.消除回溯
1)产生回溯的原因
进行推导时,若产生式存在多个候选式,选择哪个候选式进行推导存在不确定性。
2)消除回溯的基本原则
对文法的任何非终结符,若能根据当前读头下的符号,准确的选择一个候选式进行推导,那么回溯就可以消除。
注:之所以会产生回溯是因为在推导匹配的过程中存在虚假匹配。
3)消除回溯的方法
预测与提左因子
4)预测
根据读头下符号选择候选式,使其第一个符号与读头下符号相同,或该候选式可推导出的第一个符号与读头下符号相同。这相当于向前看了一个符号,所以称为预测。
编译原理学习之语法分析相关推荐
- 编译原理学习笔记·语法分析(LL(1)分析法/算符优先分析法OPG)及例子详解
语法分析(自顶向下/自底向上) 自顶向下 递归下降分析法 这种带回溯的自顶向下的分析方法实际上是一种穷举的不断试探的过程,分析效率极低,在实际的编译程序中极少使用. LL(1)分析法 又称预测分析法, ...
- [编译原理学习笔记2-2] 程序语言的语法描述
[编译原理学习笔记2-2] 程序语言的语法描述 文章目录 [编译原理学习笔记2-2] 程序语言的语法描述 [2.3.1] 上下文无关文法 [2.3.2] 语法分析树与二义性 [2.3.3] 形式语言鸟 ...
- 编译原理--实验2 语法分析
文章目录 前言 1.1实验目的 1.2 实验任务 1.3 实验内容 1.3.1 实验要求 1.3.2 输入格式 1.3.3 输出格式 1.3.4 样例 1.4 程序 1.4.1 程序流程图 1.4.2 ...
- 编译原理学习笔记20——符号表
编译原理学习笔记20--符号表 20.1 符号表的组织与操作 20.2 符号表的内容 20.3 利用符号表分析名字的作用域 20.1 符号表的组织与操作 符号表 符号表的作用与组织 符号表的整理和查找 ...
- 编译原理-学习指导与典型题解析
<编译原理-学习指导与典型题解析>这本书的pdf版本 是刘春林版本,应该是和陈火旺的是配套的,出版社一样 点击下载
- 计算机编译原理有必要学吗,计算机程序编译原理学习心得
计算机程序编译原理学习心得 <编译原理>是计算机专业的一门重要课程,正如教材:第一章的引论所述,"编译程序是现代计算机系统的基本组成部分之一"."一个编译程序 ...
- 编译原理学习笔记2——高级程序设计语言概述
编译原理学习笔记2--高级程序设计语言概述 2.1常用的高级程序设计语言 2.2程序设计语言的定义 2.2.1语法 2.2.1语法 2.2.3程序语言的基本功能和层次机构 2.2.4程序语言成分的逻辑 ...
- 编译原理学习笔记一(待续)
这几天忙着学英语,同时在学习编译原理,对这门课很感兴趣,已经制作了词法分析器,同时还在补充这个分析器的功能,也准备着手开始写语法分析器,看到最后能不能连在一起,我想如果能够将整套编译器的流程跑下来真的 ...
- 编译原理 - 学习/实践
1.应用背景 编译技术,与我们的工作[很多编程语言的工作原理]息息相关, 同时, 除了丰富的应用场景,学习编译技术对于提升程序员的竞争力也很重要. 2.学习/实践 文档阅读 JointJS - Jav ...
最新文章
- 服务器架构之性能扩展-第七章(8)
- 第四范式入围Gartner新兴技术与趋势影响力雷达全球代表厂商
- Dubbo 一篇文章就够了:从入门到实战
- html上传预览图片原理,关于html中图片上传预览的实现
- axios请求拦截器、响应拦截器、vue-router路由导航守卫的使用(案例)
- TensorFlow2.0 —— 模型保存与加载
- LPI 认证考试介绍
- MySQL怎么查游戏内邮件附件_怎么查询游戏mysql账号密码
- 【Python3】【爬虫】bilibili摄影板块
- 字符串转json(JSON.parse报错)
- 数学分析教程(科大)——2.10笔记+习题
- 实现 RadioButtonList 单选按钮组设置及横向布局
- python人像精细分割_基于UNet网络实现的人像分割 | 附数据集
- IT行业的人越来越多,工资为啥却不降反升?
- python魔方方法超详细介绍
- java apk签名证书_Android签名证书的生成
- 4rx4 服务器内存2rx4_【P00930-B21 P06190-001 64GB 2Rx4 PC4-2933Y-R 服务器内存】价格_厂家 - 中国供应商...
- 华为为何取名鸿蒙系统,华为自主操作系统为何取名鸿蒙,看完西游记才知道霸气在哪里?...
- matlab 柱状图 条纹,matlab代码画条纹柱状图
- PLUG AND PLAY LANGUAGE MODELS: A SIMPLE APPROACHTOCONTROLLEDTEXT(PPLM):代码深入理解(一)—Bag-Of-Words