编译原理-学习记录3

产生式

关于如何从集合中取出符号,构成程序

产生式规则是一个有序对( α \alpha α β \beta β),通常写作 α → β \alpha\rightarrow \beta αβ α : : = β \alpha ::=\beta α::=β
α \alpha α称为产生式的左部/头部, β \beta β称为产生式的右部/体
α ∈ ( V T ∪ V N ) + \alpha\in (V_T\cup V_N)^+ α(VTVN)+ β ∈ ( V T ∪ V N ) ∗ \beta\in (V_T\cup V_N)^* β(VTVN)

产生式用于定义语法成分,描述了一个语法成分的形成规则
例如,标识符的构成规则:
<标识符> → \rightarrow <字母>
<标识符> → \rightarrow <标识符><字母>
<标识符> → \rightarrow <标识符><数字>

竖线|用于简化有相同左部的若干条规则,例如上式可以写为:
<标识符> → \rightarrow <字母>|<标识符><字母>|<标识符><数字>

文法

EBNF:元语言符号
在EBNF中,终结符号被引号包围

文法是产生式的有穷非空的集合
文法G是一个四元组,表示形式为: G [ S ] = ( V N ,   V T ,   P ,   S ) G[S]=(V_N,\ V_T,\ P,\ S) G[S]=(VN, VT, P, S)。其中, V N V_N VN为非终结符号集, V T V_T VT为终结符号集, P P P表示产生式的有穷非空的集合, S S S表示开始符号,其至少在一条产生式中作为左部

文法的分类

0型文法:短语结构文法。 α → β ,   α ∈ ( V N ∪ V T ) + ,   β ∈ ( V N ∪ V T ) ∗ \alpha\rightarrow \beta,\ \alpha\in(V_N\cup V_T)^+,\ \beta\in(V_N\cup V_T)^* αβ, α(VNVT)+, β(VNVT)
1型文法:上下文有关文法。 α → β ,   1 ≤ ∣ α ∣ ≤ ∣ β ∣ ,   α ∈ ( V N ∪ V T ) + ,   β ∈ ( V N ∪ V T ) ∗ \alpha\rightarrow \beta,\ 1\le |\alpha|\le|\beta|,\ \alpha\in(V_N\cup V_T)^+,\ \beta\in(V_N\cup V_T)^* αβ, 1αβ, α(VNVT)+, β(VNVT)
2型文法:上下文无关文法。 A → β ,   A ∈ V N ,   β ∈ ( V N ∪ V T ) ∗ A\rightarrow \beta,\ A\in V_N,\ \beta\in(V_N\cup V_T)^* Aβ, AVN, β(VNVT)
3型文法:正规(正则)文法。右线性: A → a A\rightarrow a Aa A → a B A\rightarrow aB AaB A , B ∈ V N ,   a ∈ V T A,B\in V_N,\ a\in V_T A,BVN, aVT;左线性: A → a A\rightarrow a Aa A → B a A\rightarrow Ba ABa A , B ∈ V N ,   a ∈ V T A,B\in V_N,\ a\in V_T A,BVN, aVT

3型文法需要全都是左线性或右线性,不能同时出现左右两种线性,否则不是3型文法。例如:
S → a A ,   A → A b ∣ ϵ S\rightarrow aA,\ A\rightarrow Ab|\epsilon SaA, AAbϵ
不是3型文法,因为同时出现了右线性和左线性

在编译中涉及2型和3型文法

语言的形式定义

得到文法后,需要得到符合文法的语言

推导

符号是双向箭头,需要严格遵从定义

直接推导:如果 α → β \alpha\rightarrow \beta αβ是文法G的一条产生式,而 γ ,   δ \gamma,\ \delta γ, δ ( V T ∪ V N ) ∗ (V_T\cup V_N)^* (VTVN)中任意一个符号串,则将 α → β \alpha\rightarrow \beta αβ作用于符号串 γ α δ \gamma\alpha\delta γαδ上得到符号串 γ β δ \gamma\beta\delta γβδ,称符号串 γ β δ \gamma\beta\delta γβδ是符号串 γ α δ \gamma\alpha\delta γαδ的直接推导,记为: γ α δ ⇒ γ β δ \gamma\alpha\delta\Rightarrow\gamma\beta\delta γαδγβδ
直接推导逆过程称作直接规约

推导:设 α 0 ,   α 1 ,   … ,   a n ( n > 0 ) \alpha_0,\ \alpha_1,\ \dots,\ a_n(n>0) α0, α1, , an(n>0)均为 ( V T ∪ V N ) ∗ (V_T\cup V_N)^* (VTVN)中的符号串,且有
α 0 ⇒ α 1 ⇒ ⋯ ⇒ α n \alpha_0\Rightarrow \alpha_1\Rightarrow \dots\Rightarrow \alpha_n α0α1αn
此为长度为n的推导,记为 α 0 ⇒ + α n \alpha_0\mathop\Rightarrow\limits^+ \alpha_n α0+αn

关于箭头上的符号:
*:可以是0步推导( α 0 \alpha_0 α0 α n \alpha_n αn
+:多步推导

推导过程中没有算术运算,不涉及符号串的含义

语言

句型:S是起始符,如果 S ⇒ ∗ u S\mathop\Rightarrow\limits^* u Su,则称符号串u为文法G[S]的句型

句子:S是起始符,如果 S ⇒ ∗ u S\mathop\Rightarrow\limits^* u Su,且 u ∈ V T ∗ u\in V_T^* uVT,则称符号串u为文法G[S]的句子

句子进行到了终结符阶段

推导与语法树

语言:由某棵语法分析树生成的终结符号串的集合,记做:
L ( G [ S ] ) = { u ∣ S ⇒ ∗ u ,   u ∈ V T ∗ } L(G[S])=\{u|S\mathop\Rightarrow\limits^* u,\ u\in V_T^*\} L(G[S])={uSu, uVT}

从推导到语法树

过程:
1、将开始符号作为根结点
2、对每一个直接推导,画一个分枝
3、重复第二步,直到画不出分枝时结束

一个句子的语法树可能有多个

从语法树到推导

过程:
1、依据分支建立直接推导,然后从语法树中剪去这个分枝
2、重复第一步,直到无分枝可剪

最左推导与最右推导

如果在某个推导过程中的任何一步直接推导 α ⇒ β \alpha\Rightarrow \beta αβ中,都是对符号串 α \alpha α的最左(右)非终结符号进行替换,则称其为最左(右)推导。
最右推导又叫做规范推导。由规范推导得到的句型称为规范句型。

为语言构造文法

“凑规则”方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值