编译原理 第三章上下文无关文法及分析
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例如
简单算术表达式的文法可写为: E -> E O E | (E) | num O -> + | - | * | /
文法的Chomsky分类
有四类文法:
1. 2. 3. 4. 无限制文法 (0型) 上下文有关文法 (1型) 上下文无关文法 (2型) 正规文法 (3型)
这四种文法的关系:
无限制 上下文有关 上下文无关 正规
分析的错误处理
错误恢复 报告有意义的错误信息,并继续进行分析(去 找到尽可能多的错误) 错误修复 从提交给它的非正确版本中推断出一个可能正 确的代码版本(这通常在简单情况下才发生的)
3.2 上下文无关文法
作用 上下文无关文法说明程序设计语言的语法结构 除了上下文无关文法涉及到了递归规则之外, 与使用正则表达式说明词法结构很相似
定义 上下文无关文法G= (VT,VN,P,S):
1. VT 是终结符集合 2. VN 是非终结符集合, VN∩VT=φ 3. P 是产生式集合, 或语法规则, 形如A→ α,其中 A∈ VN 且 α ∈ (VN∪VT) * 4. S 是开始符号 , S∈VN
例如
简单的算术表达式的文法G=(VT,VN,P,S) VT={num, +, -, *, /, (, ) }
直接推导 and 直接归约
A-> β是文法 G 的产生式 , 若有v 和w 满 足:v=αAγ,w=αβγ,其中 α,γ ∈ (VN∪VT) * , 则称v 直接推导到 w,或 w直接归约到 v, 记作 v=>w 直接推导就是用产生式的右部替换产生式 的左部(非终结符)的过程 直接归约 就是用产生式的左部非终结符替 换产生式的右部的过程
例如 整型算术表达式的上下文无关文法是 exp -> exp op exp | (exp) | number op -> + | - | * number的正则表达式 number = digit digit* digit = 0|1|2|3|4|5|6|7|8|9
3.2.1 上下文无关文法的定义
结果的数来自百度文库 结构
线性结构
3.1 分析过程 3.2 上下文无关文法 3.3 分析树与抽象语法树 3.4 二义性
3.1 分析过程
分析的任务 从由扫描程序产生的记号中确定程序的语 法结构 隐式或显式地构造出表示该结构的分析树 或语法树
分析树/
记号序列
分析程序
语法树
分析的接口
输入: 当分析过程需要下一个记号时,分析程序就调 用扫描程序过程以从输入中获得它 输出: 构造的隐式或显式语法树。语法树的每个节点 包括了编译后面过程所需的特性
3.2.2 推导 和 归约
推导和归约的作用
上下文无关文法规则确定了为由规则定义的结 构的记号符号符合语法的串集 例如:对应文法 exp->exp op exp | (exp) | number op-> + | - | * (34-3)*42 是合法的串 (34-3*42 不是合法的串 文法规则通过推导或归约确定记号符号的正规 集
类型 无限制文法 ( 0型 ) 上下文有关文法 (1型) 上下文无关文法 (2型) 正规文法 (3型)
产生式 α→β V=VN∪VT α∈V+ , β∈V*
说明 对产生式没有限制
A→, , ∈ V* 将A替换成时,必须 考虑A的上下文, A∈VN , β∈V+ A→β,A∈VN , β∈V* A→aB or A→a, A,B∈VN ,a∈VT 无需考虑A在上下文中 的出现情况 等同于正则表达式
分析学习的主要内容
语法结构的描述 : 上下文无关文法 语法分析的方法(代码实现语法规则分析)
自顶向下的语法分析 自底向上的语法分析
词法分析
任务 确定单词的结 构 正则表达式
语法分析 确定程序的语法或结构
描述工具
上下文无关文法
算法
表示为DFA
自顶向下分析 自底向上分析 分析树或语法树,都是 递归的
例如 exp->exp op exp | (exp) | num op-> + | - | * (34-3)*42 的推导是: (1)exp=>exp op exp (exp->exp op exp) (2) =>exp op num (exp->num) (3) =>exp * num (op->*) (4) =>(exp)*num (exp->(exp)) (5) =>(exp op exp)* num (exp->exp op exp) (6) =>(exp op num)*num (exp->num) (7) =>(exp-num)*num (op->-) (8) =>(num-num)*num (exp->num)
表示法惯例
按照惯例,我们可以只写出一个文法的产生式 一般来说,第一个产生式的左边是开始符号 使用小写字母表示终结符 使用大写字母或用<…> 括起的表示非终结符 如果 A->α1, A-> α2, …, A-> αn 是所有左边是 A的产生式,我们可以写为 A-> α1 | α2 |… | αn
例如 文法 G: S→0S1,S→01 直接推导: 0S1 00S11 00S11 000S111 000S111 00001111 S 0S1
(S→0S1) (S→0S1) (S→01) (S→0S1)
推导和归约
=>的闭包 , α=>*β α=>*β当且仅当有0个或多个 (n>=0)推导序列 α1=>α2=>… =>αn-1=>αn,α=α1且β =αn S=>*w, 其中 w ∈ VT * 且 S是文法G的开始符 号,被称为 S 推导出 w 或 w归约到 S
VN={exp, op}
Exp是开始符号 exp -> exp op exp
exp -> (exp)
exp -> num
产生式是:
op -> +
op -> op -> * op -> /
解释
1. VT 是组成符号串的基本符号。终结符是单词 2. VN 是用来表示符号串集合的结构名 3. 开始符号“S”表示的符号串集合是由语法定 义的语言 4. 产生式定义了一种结构,结构名在箭头的左 边。箭头的右边定义了结构的布局。 5. 产生式的形式 ( A→ α) 被称为Backus-Naur 范式(或 BNF)