[编译原理学习笔记2-2] 程序语言的语法描述
对于高级程序语言及编译程序而言,语言的语法定义是非常重要的。
一些先导概念:设 Σ \Sigma Σ 是一个有穷字母表,它的每个元素称为一个符号。 Σ \Sigma Σ上的一个符号串是指由 Σ \Sigma Σ中的符号所构成的有穷序列。不包含符号的序列称为空字,记为 ϵ \epsilon ϵ。用 Σ ∗ \Sigma^* Σ∗表示 Σ \Sigma Σ上的所有符号串的全体,空字也包括在其中。
Σ ∗ \Sigma^* Σ∗的子集U和V中的 (连接)积 定义为: U V = { α β ∣ α ∈ U & β ∈ V } UV=\{ \alpha\beta∣\alpha∈ U \, \& \, \beta∈ V \} UV={αβ∣α∈U&β∈V};
规定 V 0 = { ϵ } V^0=\{\epsilon\} V0={ϵ}
[2.3.1] 上下文无关文法
文法是描述语言的语法结构的形式规则(即语法规则)。
归纳起来,一个上下文无关文法G包括四个组成部分:一组终结符号,一组非终结符,一个开始符号,以及一组产生式。
- 终结符号:是组成语言的基本符号,即在程序语言中以前屡次提到的单词符号,如基本字,标识符,常数,算符和界符等
- 非终结符号(也称语法变量):用来代表语法范畴。如“算术表达式”、“布尔表达式”、“过程”等
- 开始符号:是一个特殊的非终结符号
- 产生式(也称为产生规则或简称规则):是定义语法范畴的一种书写规则。形式是 A − > α A->\alpha A−>α
一个产生式并不足以定义一个语法范畴,特别是需要含有递归的表达式
假定G是一个文法,S是它的开始符号。如果S=>*
α
\alpha
α(表示从S出发,经0步或若干步可推出
α
\alpha
α),则称
α
\alpha
α是一个句型。仅含终结符号的句型是一个句子。文法G所产生的句子的全体是一个语言,将它记为L(G).
L
(
G
)
=
α
∣
S
=
>
+
α
&
α
∈
V
t
∗
L(G)={\alpha|S =>^+ \alpha \,\&\, \alpha∈Vt^* }
L(G)=α∣S=>+α&α∈Vt∗
形式上定义一个上下文无关文法G是一个四元式(Vt,Vn,S,£)
- Vt是一个非空有限集,它的每一个元素 称为终结符号;
- Vn是一个非空有限集,它的每一个元素称为非终结符号,Vt∩Vn=空;
- S是一个非终结符号,称为开始符号;
- £是一个产生式(有限)集合
-
所谓最左推导是指:任何一步 α = > β \alpha=>\beta α=>β都是对 α \alpha α中的最左非终结符进行替换的。同样,可定义最右推导。
-
有助于理解的一个推导
- 有助于理解的一个例题
一些用到的符号:
双箭头:推导号
单箭头:生成式的符号
| :或
一些理解:就是没有这个非终结符就没法开始推导应该就是开始符号
开始符号能推出的所有,都叫句型
文法的开始符号也是一个句型(此时是零步推导,推他自己(即没有推))
开始符号只有一个(推导的起始,是一个左部符号)
[2.3.2] 语法分析树与二义性
可以用一张图表示一个句型的推导,这种表示称为语法分析树,或简称语法树
语法树的根结点由开始符号所标记。在一棵语法树生长过程中的任何时刻,所有那些没有后代的端末结点自左至右排列起来就是一个句型。
- 何谓二义性?如果一个文法存在某个句子对应两棵不同的语法树,则称这个文法是二义的。也就是说,若一个文法存在某个句子,它有两个不同的最左(最右)推导,则这个文法是二义的。
[2.3.3] 形式语言鸟瞰
乔姆斯基把文法分为四种类型即0型、1型、2型、3型(0行强于1型,1行强于2型,2型强于3型)。
了解即可
后记
重点是推导、语法树、二义性,概念需要理解