上下文无关文法自顶向下分析
第3章 语法分析-编译原理及实践教程(第3版)-黄贤英-清华大学出版社
3.2.1 文法的定义
例1:有如下规则
<句子><主语><谓语> <主语><代词>|<名词> <代词>我 <名词>大学生 <谓语><动词><直接宾语> <动词>是 <直接宾语><代词>|<名词>
(表示由…组成)
• 归约:推导的逆过程。
• 直接归约:直接推导的逆过程
几个概念的形式定义
• 直接推导: 如果αβ是文法 G=(Vn,Vt,P,S)
的产生式,γ和δ是V*中的任意符号,若有符号 串v,w满足: v=γαδ,w=γβδ,则说v直接产生w,(w是v的 直接推导)记作:v=>w 例:S01, 0S0=>0010(直接推导γ=0,δ=0) • 如果存在v=>w0=>w1=>w2...=>Wn=w(n>0),则 称v推导出w(长度为n),记作v+=>w(至少一步) • 若有v=>w或v=w,则记作v*=>w(0步或若干步)
一个非终结符号,β∈V*)
–上例中: G=(Vn,Vt,P,<句子>)
Vn=(<句子>,<主语>,<谓语>,<代词>,<动词>,
<名词>,<直接宾语>)
Vt= (我,是,大学生)
P=
<句子><主语><谓语>
<主语> <代词>|<名词>
03-第3章-语法分析-编译原理-中国科技大学(共13讲)
• 例 ( {id, +, , , (, )}, {expr, op}, expr, P )
expr expr op expr expr expr op +
3.2 语言和文法
• 无二义的文法 stmt matched _stmt | unmatched_stmt matched_stmt if expr then matched_stmt else matched_stmt | other unmatched_stmt if expr then stmt | if expr then matched_stmt else unmatched_stmt
3.2 语言和文法
expr expr + term | term term term factor | factor factor id | (expr)
expr term
term expr factor id term factor id expr + term * factor id id + id id 分析树
3.2 语言和文法
3.2.3 验证文法产生的语言 G : S (S) S | L(G) = 配对的括号串的集合 • 按串长进行归纳:配对括号串可由S推出
–归纳基础: S – 归纳假设:长度小于2n的都可以从S推导出来 – 归纳步骤:考虑长度为2n(n 1)的w = (x) y S (S)S * (x) S * (x) y
编译原理和技术
中国科学技术大学 计算机科学与技术学院 陈意云
形式语言自动机——上下文无关文法与下推自动机(四)
无论 Xi 为终结符,还是非终结符,都有 Xi w i .
因此 ,A X1X2…Xm , w 1 w 2… w m = w
所以: 对任何 wT*, if (q,w,S)├*(q, , ), then S w.
即, wL(M) wL(G).
College of Computer Science & Technology, BUPT
(q,w,A)├ (q,w, X1X2…Xm ) ├* (q, w2…wm , X2…Xm) ├* (q, w3…wm , X3…Xm)├* …├* (q, , ).
所以: if S w, then (q,w,S)├*(q, , ).
即, wL(G) wL(M).
College of Computer Science & Technology, BUPT
13
a, z0/Az0 a, A/AA
q0 b, A/ε
b, A/ε ε, A/ε
q1 ε, z0/ε
解:(1)∵ q0,q1∈Q, ∴ 构造 S→[q0,z0,q0];
(2)对③④⑤⑥式,可构造
S→[q0,z0,q1]
由δ(q0,b,A)={( q1,ε)} 得 [q0,A,q1]→b
由δ(q1,b,A)={( q1,ε)} 得[q1,A,q1]→b
7
例3: 从文法构造等价的下推自动机
例:构造一个PDA M,使Lφ(M)= L(G)。其中G是我们常用来生 成算术表达式的文法:
G=(N,T,P,E) N={ E,T,F }, T ={ +,*,(,),a }, S = { E } P: E→E+T∣T ; T→T*F∣F; F→( E )∣a
解:构造M=({q},T,Γ,δ,q,E,φ)
编译原理语法4(自顶向下语法分析:LL分析法)
PART 01
引言
编译原理概述
01
编译原理是研究将高级语言程序转换为低级语言程序的过程、 方法和技术的学科。
02
编译过程包括词法分析、语法分析、语义分析、优化和代码生
成等多个阶段。
编译原理是计算机科学的重要分支,对于理解计算机如何执行
03
程序以及开发高效、可靠的软件具有重要意义。
语法分析在编译过程中的作用
递归下降分析法
递归下降分析法基本原理
基于文法规则
递归下降分析法是一种自顶向下 的语法分析方法,它基于文法规 则进行推导。
递归调用
对于每个非终结符,都编写一个 相应的子程序来进行识别和处理。 当遇到非终结符时,就调用相应 的子程序进行处理。
预测分析
在子程序中,根据当前输入符号 和文法规则,预测下一个可能的 输入符号,并据此选择正确的推 导路径。
WENKU DESIGN
2023-2026
END
THANKS
感谢观看
KEEP VIEW
WENKU DESIGN
WENKU DESIGN
WENKU
REPORTING
https://
01
深入学习编译原理中的其他分 析方法,如LR分析法、SLR分 析法等,以便更全面地掌握编 译原理的核心内容。
02
探索编译原理在实际应用中的 价值,如编译器设计、程序优 化等,将理论知识与实践相结 合。
03
关注编译原理领域的最新研究 动态和技术发展,不断拓宽自 己的视野和知识面。
WENKU DESIGN
递归下降分析法实现步骤
构造文法
首先,需要构造一个合适的文法,用于描述待分 析的语言。
调用子程序
编译原理课程设计之第三章上下文无关文法及分析
14
无关文法及分析
1. 上下文无关文法(即2型文法)的形式定义:
上下文无关文法是一个四元组(VT , VN , P , S):
① ②
终非结终符 结集 符合 集合VTVN(与VT产的不生左相式部交)
产生式 的右部
③ 产生式或文法规则A→α形成的集合P,
其中A∈VN,α∈(VT∪VN)* 4) 开始符号S,其中S∈VN
25
无关文法及分析
3.2 上下文无关文法的形式定义
1. 上下文无关文法(即2型文法)的形式定义 2. chomsky文法的分类 3. 推导和规约的定义 4. 句型和句子的定义 5. 最左和最右推导 6. 文法定义的语言 7. 递归产生式和递归文法 8. 文法和语言
mcy
编译原理课程设计之第三章上下文
mcy
编译原理课程设计之第三章上下文
1
无关文法及分析
第三章 上下文无关文法及分析
本章的目的是为语言的语法 描述寻求形式工具,要求该 工具对程序设计语言给出精 确无二义的语法描述。
mcy
编译原理课程设计之第三章上下文
2
无关文法及分析
第三章 上下文无关文法及分析
✓3.1 语法分析过程 ▪ 3.2 上下文无关文法的形式定义
下面的2型文法描述了包含加法、减法和乘法的简 单整型算术表达式的语法结构。
文法G[exp]:
exp → exp op exp exp →(exp) exp → number
34-3 是符合该 语法结构的简单 整型算术表达式 (句子)吗?
op → + | - | *
mcy
编译原理课程设计之第三章上下文
令G是一个如上所定义的文法,则G=(VT,VN,P,S)
编译原理(3)语法_4(自顶向下语法分析:LL(1)分析法)
课本例题3.8 第二步:计算非终结符的FOLLOW集合
G[E]: E→TE' E'→ + TE' | ε T→FT' T'→*FT' | ε F→(E) | i ③由E→TE' 知FOLLOW(E) ⊂ FOLLOW(E' ), 即FOLLOW(E' ) = {),#}; 由E→TE ' 且E ' → ε知FOLLOW(E)FOLLOW(T),即 FOLLOW(T) = {+,),#};
特别是当Y1~Yk均含有ε产生式时,应把ε也加到FIRST(X)中。
课本例题3.8 第一步:计算非终结符的FIRST集合 例3.8 试构造表达式文法G[E]的LL(1)分析表,其中: G[E]: E→TE' E'→ + TE' | ε T→FT' T'→*FT' | ε F→(E) | i
[解答] 首先构造FIRST集,步骤如下: ① FIRST(E') = {+, ε}; FIRST(T') = {*, ε}; FIRST(F) = {(, i}; ② T→F… 和E→T…知:FIRST(F) ⊂ FIRST(T) ⊂ FIRST(E) 即有FIRST(F) = FIRST(T) = FIRST(E) = {(,i}。
上下文无关文法的基本概念
上下文无关文法的基本概念上下文无关文法的基本概念定义:上下文无关文法G是一个四元组G = (N,T,P,S),其中N是非终结符的有限集合;T是终结符或单词的有限集合,它与N不相交;P是形如 A →α的产生式的有限集合,其中A∈N,α∈V ﹡,V=T∪NS是N中的区分符号,称为开始符号或句子符号。
V中的符号称为文法符号,包括终结符和非终结符。
特殊情况:A →ε空产生式例如,if语句结构的文法产生式表示:stmt →if expr then stmt else stmtBackus - Naur范式(Backus-Naur form)或BNF文法符号的使用约定:符号是终结符:字母表中比较靠前的小写字母,如a,b,c等。
操作符,如+、-等。
标点符号,如括号、逗号等。
数字0,1, (9)黑体串,如id、if等。
符号的使用约定:下列符号是非终结符:字母表中比较靠前的大写字母,如A、B、C等。
字母S,它常常代表开始符号。
小写斜体名字,如expr、stmt等。
字母表中比较靠后的大写字母,如X、Y、Z等,表示文法符号,也就是说,可以是非终结符也可以是终结符。
符号的使用约定:字母表中比较靠后的小写字母,如u,v,…,z等,表示终结符号的串。
小写希腊字母,如α、β、γ等,表示文法符号的串。
因此,一个通用产生式可以写作A →α,箭头左边(产生式左部)是一个非终结符A,箭头右边是文法符号串(产生式右部)。
符号的使用约定:如果A →α1、A →α2、…、A →αk 是所有以A为左部的产生式(称为A产生式),则可以把它们写成A →α1|α2|…|αk,我们将α1、α2、…、αk称为A的候选式。
除非另有说明,否则第一个产生式左部的符号是开始符号。
例1考虑下面的关于简单算术表达式的文法,非终结符为<表达式>和<运算符>,终结符有ID,+,-,*,/,↑,(,)。
产生式有<表达式> → <表达式> <运算符> <表达式><表达式> → (<表达式>)<表达式> → - <表达式><表达式> →ID<运算符> → +<运算符> → -<运算符> → *<运算符> → /<运算符> →↑正规表达式和上下文无关文法的关系:正规表达式所描述的每一种语言结构都可以用上下文无关文法来描述。
上下文无关文法自顶向下分析
3.2 上下文无关文法(CFG)
CFG的定义与表示 上下文无关文法,Context Free Grammar,CFG 定义3.1 CFG是一个四元组: G =(N,T,P,S),其中 (1) N是非终结符(Nonterminals)的有限集合; (2) T是终结符(Terminals)的有限集合,且N∩T=Φ; (3) P是产生式(Productions)的有限集合,形如: A→α,其中A∈N(左部),α∈(N∪T)*(右部), 若α=ε,则称A→ε为空产生式(也可以记为A →); (4) S是非终结符,称为文法的开始符号(Start symbol)。
13
3.3 语言与文法简介
计数问题 L3={anbncn|n≥1} L3'={ambmcn|m,n≥1} L3''={akbmcn|k,m,n≥1} CSL A→AC A→aAb|ab C→cC|c ? CFL 正规集 a+b+c+
命题:L3'不是正规集,因为构造不出可以识别L3'的DFA。 证明:(反证) 假设L3'是正规集,则可构造n个状态的DFA D,它接受L3'; 考察D读完ε,a,aa,...,an,分别到达S0,S1,...,Sn, 共有n+1个状态。根据鸽巢原理,序列中至少有两个状态相 同,设Si=Sj(j>i),因为aibick∈L3',所以存在路径aibick。 但是D中也有路径ajbick,矛盾。故L3'不是正规集。 aj-i bi ai ck 14 S0 Si Sk f
8
语言与文法简介
3.3 语言与文法简介
正规式与上下文无关文法 1. 正规式到CFG的转换 推论3.1 正规式描述的语言结构均可用CFG描述,反之不一定
编译原理 自顶向下语法分析方法
4.2 LL(1)文法的判别
要判别一个上下文无关文法是否是LL(1)文法 分为五步: 1. 求能推出ε的非终结符集 2. 计算每个产生式右部β的FIRST(β)集 3. 计算每个非终结符A的FOLLOW(A)集 4. 计算每个产生式A→β的SELECT(A→β)集 5. 按LL(1)文法的定义判别
S→d
A→bAS
A→ε
SELECT(S→aA)=FIRST(aA)={a} SELECT(S→d)=FIRST(d)={d}
SELECT(A→bAS)=FIRST(bAS)={b}
SELECT(A→ε) =(FIRST(ε)-{ε})+ FOLLOW(A)={#,a,d}
结论三
同一非终结符的不同产生式A→α与A→β,若
第四章 自顶向下语法分析方法
学习目标:
掌握:LL(1)文法的判别,预测分析法,
递归子程序的构造方法
理解:LL(1)文法 了解:不确定的自顶向下分析
语法分析的作用是识别由词法分析给出的单词序列 是否是给定文法的正确句子 分类:
确定的
自顶向下分析 语法分析 自底向上分析 LR分析(第五章) 不确定的 算法优先分析(第六章)
SectionFirst(X1…Xj…Xn)
= (First(X1) -{ε}) (First(X2)-{ε})… (First(Xj) -{ε}) First(Xj+1) Xj+1是产生式右部中第一个不能推出ε的符号
③
对每个产生式 A→X1…Xj…Xn 做:
First(A)=First(A) SectionFirst(X1…Xj…Xn )
回顾——后跟符号集FOLLOW(A)的定义
定义 设G=(VT, VN, P, S)是上下文无关文法, B→xAy (A,B ∈VN x,y ∈(VNVT)* ) FOLLOW(A)={a|S=>*…Aa…,a ∈VT}, 若有S=>* …A,则规定 # ∈FOLLOW(A) (注: # 输入串#,‘#’做为输入串的结束符) 直观上说,非终结符A的后跟符号集是由句型中紧跟A后的那 些终结符(包括#)组成。
自顶向下语法分析方法
7
PL/0语言文法的EBNF表示
PL/0语言文法的EBNF表示 <程序>∷=<分程序>. <分程序>∷=[<常量说明部分>][<变量说明部分>][<过程说明部分>]<语句> <常量说明部分>∷=CONST<常量定义部分>{,<常量定义>}; <无符号整数>∷=<数字>{<数字>} <变量说明部分>∷=VAR<标识符>{,<标识符>}; <标识符>∷=<字母>{<字母>|<数字>} <过程说明部分>∷=<过程首部><分程序>{;<过程说明部分>}; <过程首部>∷=PROCEDURE <标识符>; <语句>∷=<赋值语句>|<条件语句>|<当型循环语句>|<过程调用语句>| <读语句>|<写语句>|<复合语句>|<空> <赋值语句>∷=<标识符>:=<表达式> <复合语句>∷=BEGIN <语句>{;<语句>} END <条件>∷=<表达式><关系运算符><表达式>|ODD<表达式>
例如对文法G3[S]: S→aAS|b A→bA| SELECT(S→aAS)={a} SELECT(S→b)={b} SELECT(A→bA)={b} SELECT(A→)={a,b}
04 语法分析(1) _ 概述(含 消除左递归)
消除间接左递归的方法:
(1) 把间接左递归文法改写为直接左递归文法;
(2) 用消除直接左递归的方法改写文法。
下面给出一个消除文法所有左递归性的算法,该算
法对文法的要求是:文法不含回路(形如PP的
推导),且不含以ε为右部的产生式。
通用算法
• 阅读 P84 算法4.1
①把G的非终结符按任意顺序排列,如A1,…,An ②for(i=1;i<=n;i++)
0 1
q0
1
q1
q2
【定义】一个下推自动机可定义为一个7元组:
PDA M=(Q, , , q0, Z0, F, )
其中: ① Q是有限状态集; ② 是输入符号集; ③ 是栈符号集; ④ q0Q,称为起始状态; ⑤ Z0,称为栈起始符; ⑥ FQ,称为接受状态集; ⑦ 是转移函数,定义域为Q×({ε})×,且表示由 “当前状态qi、输入符号a和栈顶符号x决定PDA的转 移动作”。值域为Q×*,指明下推自动机的动作结 果包括“状态转移和栈操作”。
例4.6
设有文法G: I→I0 | Ia | Ib | a | b
对左递归文法G改写后的文法G'为 I → aI' | bI' I ' → 0I' | aI' | bI' |ε
习题 4.8
将下面的左递归文法G(S)改为非左递归的。
S → SaP|Sf |P P → QbP|Q Q → cSd|e 【解】 S → PS’ S’→ aPS’| f S’|ε P → QbP|Q Q → cSd|e
第4章 语法分析
—— 自顶向下分析法
思考题
上次课所留问题:
设计例3-3的词法分析程序。
第四章+自顶向下的语法分析
E id
+ E id
*
18
三、重要问题——二义性及其消除
二义性文法 E→E+E|E-E|E*E|E/E|(E)|id 非二义性文法 E→E+T|E-T|T T→T*F|T/F|F F→(E)|id 改造方法:引入语法变量,使文法含有更多的信息
19
三、重要问题——二义性及其消除
再例:If语句 S→if E then S S→if E then S else S S→other 设执行下列语句前b=0, 理解1:if a≠0 then if a>0 then b=1 else b=-1 当a=1时,执行后b=1;当a=-1时,执行后b=-1 理解1: if a≠0 then if a>0 then b=1 else b=-1 当a=1时,执行后b=1;当a=-1时,执行后b=0
中间代码
代码优化器
中间代码
目标代码生成器
目标代码
7
语法分析:推导、规约 推导中遇到的问题:
回溯 死循环 二义文法 LL文法
选择确定的候选式进行推导
引入First集和Follow集 思考什么样的文法叫LL文法 预测分析表 控制程序 数据结构
预测分析器(预测分析法)
第4章 自顶向下的语法分析
语法分析(Syntax Analysis) 文法的改造问题 自顶向下(Top Down)的分析 推导(Derivation)
2011-12-25 9
4.1 语法分析的任务
语法分析(Syntax Analysis)
检查扫描器输出的单词序列是否符合该语 言的文法——组成句子,并分析组成此句 子的语法成分 Parser Syntax Analyzer
编译原理-清华大学-第4章-自顶向下语法分析方法(3+1)
(2)一个文法提取了左公共因子后,只解决 了相同左部产生式右部的FIRST集不相交问 题,当改写后的文法不含空产生式,且无左 递归时,则改写后的文法是LL(1)文法,否 则还需用LL(1)文法的判别方式进行判断才 能确定是否为LL(1)文法。
• FIRST(Ap)={a,c} • FIRST(Bq)={b,d}
2、非终结符A后跟符号FOLLOW集的定义:
• 定义:设 G = (VT ,VN , S , P) 是上下文无关文 法,A∈VN , S是开始符号。 FOLLOW(A)={a|S * …Aa… ,a∈VT} 若S *…A,则规定 #∈FOLLOW(A)
(3)反复使用规则(2)直到每个非终结符的 FOLLOW集不再增大
S→AB S→bC A→ε A→b B→ε B→aD C→AD C→b D→aS D→c
FOLLOW(S)={#}∪FOLLOW(D) FOLLOW(A)=( FIRST(B)-{ε} )∪
FOLLOW(S) ∪ FIRST(D) FOLLOW(B)=FOLLOW(S) FOLLOW(C)=FOLLOW(S) FOLLOW(D)=FOLLOW(B)∪FOLLOW(C)
• 1表示:只需向右看1个输入符号便可决定 如何推导(即选择哪个产生式进行推导)。
• 类似也可以有LL(K)文法:需向前查看K个 输入符号才可确定选用哪个产生式。
• 文法G[S]是否是LL(1)文法: S→aA S→d A→bAS A→ε
SELECT(S→aA) ={a} SELECT(S→d)={d} SELECT(A→bAS)={b} SELECT(A→ε)={a,d,#} SELECT(S→aA)∩SELECT(S→d)={a}∩{d}=Φ SELECT(A→bAS)∩SELECT(A→ε)={b}∩{a,d,#}=Φ
编译原理之自顶向下语法分析方法(25页)
间接左递归 若 PP α S→Aa A→Sb A→b
2021/8/25
5
消除左递归
消除直接左递归 形如:P → P α| β α非, β不以P打头
改写为:P → βP’ P’ → αP’|
2021/8/25
6
消除左递归
例:E → E+T|T T →T*F|F F →(E)| i
G[ E]: (1) E → TE’ (2) E’ → +TE’| (3) T → FT’ (4) T’ → *FT’ | (5) F → (E)|i
A →Bb|b
2021/8/25
10
回溯问题
例:S →iEtS|iEtSeS|a
E→b
判断句子ibtaea
提取左公因子:A →αβ1|αβ2
变为:
A →αA’
A’ →β1 |β2
若A →αβ1|αβ2 |…|αβn|r
变为:
A →αA’|r
A’ →β1 |β2|…|βn
2021/8/25
11
例:S →iEtS|iEtSeS|a
2021/8/25
Procedure E’; IF sym=‘+’ then Begin advance; T;E’ End;
Procedure T’; IF sym=‘*’ then Begin advance; F;T’ End;
14
3非递归的预测分析方法(LL(1))
一、总控程序 Input
24
非LL(1)文法的改造
消除左递归 提左公因子
2021/8/25
25
22
三、LL(1)文法:
一个文法G,若它的分析表M不含多重定义入 口,则称为LL(1)文法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
E E id + E id E * E id
E id
E E + + E id (c) +左结合 E id
E id
E + E id (d) +右结合 E + E id
(a) 先进行+运算
(b) 先进行*运算
18
3.2 上下文无关文法(CFG)
定义3.7 若文法G对同一句子产生不止一棵分析树,则称G是二 义的。 原因:在产生句子的过程中某些直接推导有多于一种选择 注意: 1. 一个句子有多于一棵分析树,仅与文法和句子有关,与 采用的推导方法无关; 2. 文法中缺少对文法符号优先级和结合性的规定。 “悬空(dangling)else”问题 S → if C then S | if C then S else S | id := E C→ E=E|E<E|E>E E → E + E | - E | id | n (1) (2) (3) (4)...(6) (7)...(10)
6
3.2 上下文无关文法(CFG)
定义3.2 利用产生式产生句子的过程中,将产生式A→γ的右部 代替文法符号序列αAβ中的A得到αγβ的过程,称αAβ直接推 导出αγβ,记作:αAβ=>αγβ。 若对于任意文法符号序列α1,α2,...αn,均有α1=>α2=>...=>αn, 则称此过程为零步或多步推导,记为: α1=*>αn,其中α1=αn的情况为零步推导。 若α1≠αn,即推导过程中至少使用一次产生式,则称此过程为 至少一步推导,记为:α1=+>αn。 两点注意: α,有α=*>α,即推导具有自反性; 若α=*>β,β=*>γ,则α=*>γ,即推导具有传递性。
CSG、CFG、正规式能力递减,但是能力越强的文法,其文法 设计和自动机的构造越困难,因此语法分析仅用到CFG(除 特别指出,文法即指CFG )
16
二义性与二义性的消除
3.2 上下文无关文法(CFG)
二义性与二义性的消除
二义性问题:一个句子可能对应多于一棵分析树 [例3.7] 文法G3.2为 E→E+E | E*E |(E)| -E | id 句子id+id*id和id+id+id可能的分析树有:
7
3.2 上下文无关文法(CFG)
定义3.3 由CFG G所产生的语言L(G)被定义为: L(G) = { ω┃S=+>ω and ω∈T* }, L(G)称为上下文无关语言(Context Free Language, CFL),ω称为句子。 若S=*>α,α∈(N∪T)*,则称α为G的一个句型。
[例3.4] 用(G3.2)产生终结符序列-(id+id)可如下: E → E + E (1) E => -E | E * E (2) => -(E) |(E) (3) (G3.2) => -(E+E) | -E (4) => -(id+E) | id (5) => -(id+id)
by(4) by(3) by(1) by(5) by(5)
定义3.4 在推导过程中,若每次直接推导均替换句型中最左边 的非终结符,则称为最左推导,由最左推导产生的句型被称 为左句型。 类似可定义最右推导与右句型,最右推导也被称为规范推导。
E => -E => -(E) => -(E+E) => -(id+E) => -(id+id) α1 α2 α3 α4 α5 α6 α6是句子,所有αi (i=1...6)均是句型。
句子akbkck 的推导: S =>...=> ak-1S(BC)k-1 (by 1) => ak(BC)k (by 2) =>...=> akBkCk (by 3) (2) => akbBk-1Ck (by 4) (4) =>...=> akbkCk (by 5) (6) => akbkcCk-1 (by 6) =>...=> akbkck (by 7)
3.3 语言与文法简介
形式语言与自动机简介 定义3.8 若文法G=(N,T,P,S)的每个产生式α→β中,均有 α∈(N∪T)*,且至少含有一个非终结符,β∈(N∪T)*,则 称G为0型文法。 对0型文法施加以下第i条限制,即得到i型文法。 1. G的任何产生式α→β(S→ε除外)满足|α|≤|β|; 2. G的任何产生式形如A→β,其中A∈N,β∈(N∪T)*; 3. G的任何产生式形如A→a或者A→aB(或者A→Ba),其 中A和B∈N,a∈T。
12
3.3 语言与文法简介
[例3.12] 不能用CFG描述的语言: L1={ωcω|ω∈(a|b)*} (标识符声明与引用一致性的抽象) L2={anbmcndm|n≥1和m≥1} (形参与实参一致性的抽象) L3={anbncn|n≥1} (计数问题的抽象) 相近的CFL: L1'={ωcωr|ω∈(a|b)*} L2'={anbmcmdn|n≥1, m≥1} L2''={anbncmdm|n≥1, m≥1} L3'={ambmcn|m, n≥1} S→aSa|bSb|c S→aSd|aAd A→bAc|bc S→AB A→aAb|ab B→cBd|cd A→AC A→aAb|ab C→cC|c
记号 → 读作“定义为”或者“可导出”。 “E → E + E” 表述为“算术表达式定义为两个算术表达式 相加”;或者“一个算术表达式加上另一个算术表达式, 仍然是一个算术表达式”。
4
3.2 上下文无关文法(CFG)
2. 由产生式集表示CFG
前提: 结论: 若文法正确 文法开始符号S是第一个产生式的左部; N是可以出现在产生式左边符号的记号集合; T是绝不出现在产生式左边符号的记号集合; P: E→E+E (1) S=E E→E*E (2) N={E} E →(E) (3) T={+,*,(,),-,id} E → -E (4) E → id (5) 产生式表示也被称为巴克斯范式(Backus-Naur Form, BNF),其中→用::=表示
8
语言与文法简介
3.3 语言与文法简介
正规式与上下文无关文法 1. 正规式到CFG的转换 推论3.1 正规式描述的语言结构均可用CFG描述,反之不一定
从正规式到CFG的对应关系: ① 构造正规式的NFA; ② 若0为初态,则A0为开始符号; ③ 对于move(i,a)=j,引入产生式Ai→aAj; ④ 对于move(i,ε)=j,引入产生式 Ai→Aj; ⑤ 若i是终态,则引入产生式Ai →ε。 [例3.11] 从正规式r=(a|b)*abb的NFA构造CFG: A0 → aA0|bA0|aA1 a A1 → bA2 a b 0 1 2 A2 → bA3 b A3 → ε
if x<3 then if x>0 then x:=5 else x:=-5 else与离它远的then匹配
x<3 if x>0 then x:=5 else x:=-5 S else与离它近的then匹配
x:=-5
20
if then
3.2 上下文无关文法(CFG)
E 文法二义不能说明它所产生的语言 一定是二义的。 E + T 消除语言二义有两种方法: ① 改写二义文法为非二义文法; T T * F ② 规定二义文法中符号的优先级 F F id 和结合性。 id id ① 改写 [例3.9] 与G3.2等价的非二义文法: E→E+E E→E+T |T | E*E T→T*F|F (G3.4) |(E) (G3.2) F →(E) | -F | id | -E 问题:如何改写? | id
经验的方法: A → HT H →ε| Ha | Hb T → abb
b
3
10
3.3 语言与文法简介
2. 为什么用正规式而不用CFG描述词法? ① 词法规则简单,用正规式描述已足够; ② 正规式的表示比CFG更直观、简洁、易于理解; ③ 有限自动机的构造比下推自动机简单,且分析效率高; ④ 区分词法和语法,为编译器前端的模块划分提供方便。 贯穿词法分析和语法分析始终的思想: ① 语言的描述和语言的识别是表示一个语言的两个不同侧面, 二者缺一不可;(语言、文法、自动机) ② 用正规式和CFG描述的语言,对应的识别方法(自动机) 不同; ③ 正规式适合描述线性结构,如标识符、关键字、注释等; CFG适合描述具有嵌套(层次)性质的非线性结构,如不 同结构的句子if-then-else、while-do等。
13
3.3 语言与文法简介
计数问题 L3={anbncn|n≥1} L3'={ambmcn|m,n≥1} L3''={akbmcn|k,m,n≥1} CSL A→AC A→aAb|ab C→cC|c ? CFL 正规集 a+b+c+
命题:L3'不是正规集,因为构造不出可以识别L3'的DFA。 证明:(反证) 假设L3'是正规集,则可构造n个状态的DFA D,它接受L3'; 考察D读完ε,a,aa,...,an,分别到达S0,S1,...,Sn, 共有n+1个状态。根据鸽巢原理,序列中至少有两个状态相 同,设Si=Sj(j>i),因为aibick∈L3',所以存在路径aibick。 但是D中也有路径ajbick,矛盾。故L3'不是正规集。 aj-i bi ai ck 14 S0 Si Sk f
上下文无关文法 自顶向下分析
4.1~4.4
上下文无关文法的相关概念