编译原理笔记-02程序设计语言及其文法

本文详细介绍了程序设计语言的文法基本概念,包括字母表、串、文法的定义、语言的定义以及文法的分类。通过具体例子解释了串的运算,如连接、幂等,并详细阐述了0型至3型文法的特性,强调了文法在描述语言规则中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本概念

字母表

字母表Σ是一个有穷符号集合

  • 符号:字母、数字、标点符号、……

【例】字母表

  • 二进制字母表:{0,1}
  • ASCII字符集
  • Unicode字符集

字母表上的运算

  • 字母表Σ相乘:{0,1}{a,b}={0a,0b,1a,1b}
  • 字母表Σ次幂:{0,1}3={0,1}{0,1}{0,1}={000,001,010,011,100,101,110,111}
  • 字母表Σ闭包:{a,b,c,d}+={a,b,c,d,aa,ab,ac,ad,ba,bb,bc,bd,……,aaa,aab,aac,aad,aba,abb,abc,……}
  • 字母表Σ克林闭包:{a,b,c,d}*={ε,a,b,c,d,aa,ab,ac,ad,ba,bb,bc,bd,……,aaa,aab,aac,aad,aba,abb,abc,……}

ε,表示空串

  • 字母表Σ克林闭包中的每一个元素都称为是字母表Σ上的一个
  • 串s的长度,记作**|s|,指串中符号的个数**

串上的运算

  • 连接:x和y的连接就是把y附加到x后面形成的串,记作xy
    • 【例】x=dog且y=house,那么xy=doghouse
    • 空串ε是连接运算的单位元,对于任意串,εs=sε=s
    • 设x,y,z是三个字符串,如果x=yz,则称y是x的前缀,z是x的后缀
  • :串s的n次幂就是将n个s连接起来
    • 【例】若s=ba,则s1=ba,s2=baba,s3=bababa,……

文法的定义

什么是文法

图中第一个规则表示一个句子应该由一个名词短语连接动词短语构成。

从上面自然语言的例子中可以提取出文法的一些组成要素。

  • 尖括号括起来的部分称为语法成分
  • 未用尖括号括起来的部分称为语言的基本符号

因为该文法是用来描述句子的构成规则的,所以该文法的基本符号单词;如果一个文法是用来描述单词的构成规则的,那么该文法的基本符号就是字母

简而言之,文法就是一套语言规则。

文法的形式化定义

文法用大写字母G表示,把一个文法G定义为一个四元组

G=(VT,VN,P,S)

  • VT:终结符集合

    • 终结符(terminal symbol)是文法所定义的语言的基本符号,有时也称为token
    • 【例】上例中文法用来描述句子的构成规则,,所以该文法的基本符号单词。VT={apple,boy,eat,little}
  • VN:非终结符集合

    • 非终结符(non terminal)是用来表示语法成分的符号,有时也称为"语法变量"。因为可以用由它们推导出其他语法成分,所以叫做非终结符。
    • 【例】上例中文法的VN={<句子>,<名词短语>,<动词短语>,<名词>,……}
    • VT∩VN=Φ,VT和VN不相交;VT∪VN=文法符号集,VT并上VN构成文法符号集
  • P:产生式集合

    • 产生式(production)描述了将终结符和非终结符组合成串的方法
    • 产生式的一般形式:α→β,读作α定义β
    • α∈(VT∪VN)+,且α中至少包含VN中的一个元素:称为产生式的左部
    • β∈(VT∪VN)*:称为产生式的右部
    • 由上面两式可以看出:α和β表示的是文法符号
    • 【例】上例中文法的每一个规则都是一个产生式
  • S:开始符合

    • S∈VN。开始符号(start symbol)表示的是该文法中最大的语法成分
    • 【例】上例中文法的开始符号S是句子。S=<句子>

【例】算术表达式的文法

文法可简写为表达式

产生式的简写

  • 对一组有相同左部的α产生式α→β1,α→β2,……,α→βnα→β1,α→β2,……,α→βnαβ1αβ2αβn
  • 可以简记为:α→β1∣β2∣……∣βnα→β1|β2|……|βnαβ1β2βn
  • 读作:α定义为β1,或者β2,……,或者βn
  • β1,β1,……,β1称为α的候选式(Candidate)

【例】产生式E的简写

符号约定

为了避免总是声明哪些是终结符,哪些是非终结符。我们对符号的使用做一些约定。

符号约定例如
终结符字母表中排在前面的小写字母;运算符;标点符号;数字;粗体字符串a,b,c;+,*;括号、逗号;id、if
非终结符字母表中排在前面的大写字母;字母S,通常表示开始符号;小写、斜体的名字;代表程序构造的大写字母A,B,C;expr、stmt;E(表达式)、T(项)和F(因子)
文法符号字母表中排在后面的大写字母X,Y,Z
终结字符串字母表中排在后面的小写字母u,v,……,z
文法符号串小写希腊字母α,β,γ

除非特别说明,否则第一个产生式的左部就是开始符号

语言的定义

推导与归约

给定文法G=(VT , VN , P , S ),如果 α→β ∈ P,那么可以将符号串γαδ中的α替换为β,也就是说,将γαδ 重写(rewrite)为γβδ,记作 γαδ ⇒ γβδ。此时,称文法中的符号串 γαδ 直接推导(directly derive)出 γβδ

简而言之,就是用产生式的右部替换产生式的左部

【例】推导与归约

  • 从图中可以看到,从<句子>可以推导出little boy eats apple,逆过程就叫归约
  • 推导就是用产生式的右部替换产生式的左部
  • 规约就是用产生式的左部替换产生式的右部

有了文法(语言规则),如何判定某一词串是否是该语言的句子?

  • 句子的推导——从生成语言的角度
  • 句子的归约——从识别语言的角度

语言的形式化定义

由文法G的开始符号S推导出的所有句子构成的集合称为文法G生成的语言,记为L(G)。即

L(G)= {w | S ⇒* w, w∈ VT* }

文法解决了无穷语言的有穷表示问题。

文法的分类

根据对文法中产生式的不同要求,可将文法分为四种类型

0型文法

α→βα→βαβ

  • 无限制文法/短语结构文法(Phrase Structure Grammar, PSG )
    • ∀α→β∈P,α中至少包含一个非终结符∀α→β∈P,α中至少包含一个非终结符αβPα
  • 0型语言
    • 由0型文法G生成的语言L(G)

1型文法

α→βα→βαβ

  • 上下文有关文法(Context-Sensitive Grammar , CSG )
    • ∀α→β∈P,∣α∣≤∣β∣∀α→β∈P,|α|≤|β|αβPαβ,即产生式左部的符号个数不能多于右部的符号个数
    • 产生式的一般形式:α1Aα2→α1βα2(β≠ε)α1Aα2→α1βα2 (β≠ε)α1Aα2α1βα2(β=ε),即非终结符A只有当它的上下文是α1α2的的时候,才能替换为β。因此是上下文有关文法
    • 可以看出,CSG中产生式右部不能是空串。即CSG中不包含ε-产生式(空产生式)
  • 上下文有关语言(1型语言)
    • 由上下文有关文法(1型文法)G生成的语言L(G)

2型文法

α→βα→βαβ

  • 上下文无关文法(Context-Free Grammar, CFG )
    • ∀α→β∈P,α∈VN∀α→β∈P,α∈V_NαβPαVN,即产生式左部必须是一个非终结符
    • 产生式的一般形式:A→βA→βAβ,前文提到过符号约定非终结符为A。即将A替换为β不需要考虑它的上下文。
  • 上下文无关语言(2型语言)
    • 由上下文无关文法(2型文法)G生成的语言L(G)

3型文法

α→βα→βαβ

  • 正则文法 (Regular Grammar, RG )
    • 右线型文法:A→wB或A→w,在2型文法基础上,对产生式右部进行限制,要么是一个终结符号串w,要么是一个终结符号串w右边有一个非终结符B
    • 左线型文法:A→Bw或A→w,在2型文法基础上,对产生式右部进行限制,要么是一个终结符号串w,要么是一个终结符号串w左边有一个非终结符B
    • 即产生式左部只能有一个非终结符
  • 正则语言(3型语言)
    • 由正则语言(3型文法)G生成的语言L(G)
  • 正则文法能描述程序设计语言的多数单词

四种文法之间的关系

  • 逐级限制
    • 0型文法:α中至少包含1个非终结符
    • 1型文法(CSG):|α|≤|β|
    • 2型文法(CFG):α ∈ VN
    • 3型文法(RG):A→wB 或 A→w (A→Bw 或A→w)
  • 逐级包含

CFG的分析树

  • 根节点的标号为文法开始符号
  • 内部结点表示对一个产生式A→β的应用,该结点的标号是此产生式左部A 。该结点的子结点的标号从左到右构成了产生式的右部β
  • 叶结点的标号既可以是非终结符,也可以是终结符。从左到右排列叶节点得到的符号串称为是这棵树的产出( yield )或边缘(frontier)

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

推导过程:E ⇒ - E ⇒ - (E) ⇒ - (E+E) ⇒ -(id+E) ⇒ - (id+id)

短语

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

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

【例1】短语与直接短语

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

但产生式的右部不一定是给定句型的直接短语

【例2】产生式的右部不一定是给定句型的直接短语

二义性文法

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

【例】二义性文法

二义性文法的判定

对于任意一个上下文无关文法,不存在一个算法,判定它是无二义性的;但能给出一组充分条件,满足这组充分条件的文法是无二义性的

  • 满足,肯定无二义性
  • 不满足,也未必就是有二义性的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熠熠晨曦_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值