编译原理(七) 之 CFG的分析树

简介: 编译原理(七) 之 CFG的分析树

CFG分析树

G: 
   ① E -> E + E,
     ② E -> E * E,
     ③ E -> -E
     ④ E -> (E),
     ⑤ E -> id

根节点的标号为 文法开始符号

内部节点表示对一个产生式A -> β 的应用,该节点的标号就是此产生式的左部A, 该节点的子节点的标号从左到右构成了产生式的右部β

上图中分析树的根节点就是③, ③的左部构成了产生树的根节点, 右部则是树的子节点, 然后依次往下进行分解,就够成了分析树

叶节点的标号既可以是非终结符,又可以是终结符,从左到右排列叶节点得到的符号串就是这棵树的产出 或者边缘

分析树是推导的图形化表示

给定一个推导S => a1 => a2 => …=> an, 对于推导过程中得到的每一句子ai ,都可以构造出一个边缘为ai 的分析树


例:

E => -E => - (E + E) => - (id + E) => -(id + id)


(句型的) 短语

给定一个句型,其分析树的每一颗子树的边缘称为该句型的一个短语(phrase)

如果子树只有父子两代节点, 那么这棵树的边缘称为该句型的一个 直接短语

如上的分析树中

- (E + E) 就是一个短语

(E + E) 也是一个短语

E + E 也是一个短语,并且是 直接短语,因为子树是2层


直接短语一定是某产生式的右部,某产生式的右部, 不一定是直接短语


二义性文法

如果一个文法可以为某个句子生成多颗分析树, 则称这个文法是二义性的


文法:

S -> if E then S
     if E then S else S
     other

句型:

if E1 then if E2 then S1 else S2

产生如下分析树, 由于 后边的 else既可以根最前边的if 匹配,又可以跟中间的if匹配,所以就产生了歧义,也就产生了两颗分析树

其实大多数编程语言都规定 else 跟 最近的尚未匹配的 if 来进行匹配,这样的话就会消除歧义,那么第一个分析树就是对的


对于任意一个上下文无关文法, 不存在一个算法,判断他是否有二义性, 只能通过给定的一组充分条件, 满足这个组充分条件的文法就是无二义性.

满足充分条件则是无二义性, 不满足条件也不一定有二义性.


相关文章
|
存储 编译器 C语言
Makefile基础教程(变量的介绍和使用)
Makefile基础教程(变量的介绍和使用)
233 0
|
9月前
|
Java
JavaSE 面向对象程序设计 文件File 介绍练习加千行代码详解
JavaSE 面向对象程序设计 文件File 介绍练习加千行代码详解
31 0
【JavaSE】Java基础语法(三十三):File 一文详解
1. File类概述和构造方法 File类介绍 它是文件和目录路径名的抽象表示 文件和目录是可以通过File封装成对象的 对于File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而已.它可以是存在的,也
|
存储 Shell vr&ar
Makefile基础教程(函数的使用)
Makefile基础教程(函数的使用)
125 0
|
前端开发 Java 程序员
💖✨MVC开发规则精讲
MVC开始是存在于桌面程序中的,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。比如一批统计数据可以分别用柱状图、饼图来表示。C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。
💖✨MVC开发规则精讲
|
Linux API 开发工具
|
C语言
玩转Makefile | 四步教你从零开始写Makefile
玩转Makefile | 四步教你从零开始写Makefile
168 0
|
存储 Python
第四章--第一节:函数
第四章--第一节:函数
124 0
|
设计模式 安全 C++
我个人整理的C++单例模式,推荐boost方式(★firecat推荐★)
我个人整理的C++单例模式,推荐boost方式(★firecat推荐★)
1005 0
|
数据采集 SQL Python
怎么让你的代码更Pythonic?光有技巧可不行,你还需要看这些……
写代码如同写文章,好的文章是反复修改出来的,代码也同样是反复的重构出来的。今天给大家分享下,怎么从一个编程学习者变为一个程序猿(程序媛)!起码不要让别人一看你的代码就知道你是个小菜鸟! 我们通常写一个代码,必然会经过一个...
1082 0