编译原理:第七节
来源:互联网 发布:spss的数据录入 编辑:程序博客网 时间:2024/04/30 22:10
语法分析
语法分析的概念:
语法分析是编译程序的核心部分,完成词法分析后就进入该阶段。语法分析的主要任务是:按照语言的词法规则,对单词串形式的源程序进行语法检查,并识别出相应的语法成分采用语法树的形式输出,如果不符合语法要求则给出出错的原因。(词法的产生式中的终结符号是单个符号,而语法的产生式的终结符号是单词符号)
语法分析方法:
语法分析方法按语法分析途径,即生成分析树的方向,分为两类:
1. 自上而下分析方法:从文法的开始符号出发,反复使用合适的产生式对句型中非终结符替换,寻找匹配于输入符号串的最左推导。若存在,则输入符号串在语法上是合法的,否则不合法。
2. 自下而上分析方法:从输入符号串开始,逐步进行归约,直至归约到文法(语法)的开始符号。(最右推导的逆过程,称为规范归约)
例:S——>aAS|a A ——>SbA | SS | ba
自上而下分析aabbaa
自上而下分析aabbaa
而自下而上的话反过来从底开始归约。
对于自上而下分析,我们依次尝试匹配,如果当前字符匹配则继续匹配下一个,否则回溯。很明显,这种带回溯的试探法识别的过程很容易使用递归
程序来实现其算法。
不确定性的原因
带回溯的自上而下分析法的效率低,开销大,甚至会导致算法实现的失败。其原因是分析过程中的选择候选式的不确定性。举个例子好理解一些:
例:已知G:S —> Sa | Sb | a 输入串: abb
按照自上而下分析法,则对非终结符S的最左推导会使分析树无休止的延伸。每次选择S的候选式匹配时,又回到它本身,循环无休止的执行下去,
即陷入了死循环。左递归文法都会导致此种情况,所以自上而下分析不能处理左递归文法。(左递归包括直接左递归和间接左递归)
消除直接左递归
消除间接左递归
对于间接左递归,使用代入法来解决,举个例子来看:
1 0
- 编译原理:第七节
- 编译原理:第七节 及词法分析器的C++和Python实现
- 读《编译原理》第七章,运行时刻环境
- 编译原理:第二节
- 编译原理:第四节
- 编译原理:第六节
- 编译原理丨第七周 ——1000. 词法分析程序设计 **
- 第十二周知原理第七题
- 编译原理
- 《编译原理》
- 编译原理
- 编译原理
- 编译原理
- 编译原理
- 编译原理
- 编译原理
- 编译原理
- 编译原理
- STL中的模板类pair
- iOS软件开发常见通过Cocoapods安装的第三方框架
- HDU 3567 Eight II
- 迁移学习(transfer learning)、多任务学习(multi-task learning)、深度学习(deep learning)概念摘抄
- HDU5476 Explore Track of Point【计算几何】
- 编译原理:第七节
- 面试小记-2-找出二维数组里连续的'A'
- LeetCode:Maximum Depth of Binary Tree
- UVa 10215 - The Largest/Smallest Box ...
- 【性能测试】nGrinder设置hosts
- python split做简易计算器
- github配置和上传
- java中的线程
- 1、深入浅出JMS(一)--JMS基本概念