高级语言
高级语言:程序语言是一个记号系统,包括语法和语义两部分组成
语法
语法任何语言程序都可以看成是一定字符集(字母表) 上的字符串,语法使得这串字符形成一个形式上正确的程序
例如:0.5*x1+c
- 0.5、x1、c、*、+是语言的单词符号
- 0.5*x1+c是语言的语法单位 单词符号 :语言中具有独立意义的最基本结构
语法单位:表达式、子句、语句、函数、过程、程序
词法规则:规定了字母表中那些字符串是单词符号,单词符号一般包括:关键字、标示符、常量、运算符、界限符。我们用正规式和有限自动机理论来描述词法结构 和进行词法分析
语法规则:规定了如何从单词符号来形成语法单位。现在多数程序语言使用上下文无关文法来描述语法规则。
语言的词法规则和语法规则定义了程序的形 式结构,是判断输入字符串是否构成一个形 式上正确的程序的依据*
语义
语义对于一个语言来说,不仅要给出它的词法、语法 规则,而且要定义它的单词符号和语法单位的意义。
- 离开语义,语言只是一堆符号的集合。
- 各种语言中有形式上完全相同的语法单位,含义却不尽相同
- 对某种语言,可以定义一个程序的意义的一组规 则称为语义规则
- 目前,大多数编译程序使用基于属性文法的语法,制导翻译方法来分析语义
字母表与符号串
相关概念
- 字母表:是符号的非空有穷集合,用Σ、V表示。例:二进制字母表:{ 0,1 } 、ASCII字符集 、Unicode字符集。
- 符合:是语言中最基本的不可再分的单位,例如 字母、数字、标点符号等。
- 符号串:是字母表中符号组成的有穷序列。
- 串s的长度,通常记作|s|,是指s中符号的个数,例: |aab|=3
- 空串,不含有任何符号的串称作空串,串长度为0,用 ε(epsilon)表示,|ε|= 0
- 句子:字母表上符合某种规则构成的串。
- 语言:是字母表上符合某种规则的语句组成的。字母表上语言:是字母表上正闭包的子集
约定用a,b,c...表示符号;用α,β,γ...表示符号串; 用A,B,C...表示其集合
字母表上的运算
字母表∑1和∑2的乘积( product)
例: {0, 1} {a, b} ={0a, 0b, 1a, 1b}
∈ 表示元素和集合之间的关系。若a∈A,则a属于集合A,a是集合A中的元素。
字母表∑的n次幂( power)
字母表∑的n次幂:长度为n的符号串构成的集合
例: {0, 1}3 ={0, 1} {0, 1} {0, 1} ={000, 001, 010, 011, 100, 101, 110, 111}
字母表∑的正闭包( positive closure)
字母表∑的正闭包:长度正数的符号串构成的集合
例:{a, b, c, d }+ = {a, b, c, d, aa, ab, ac, ad, ba, bb,bc, bd, ..., aaa, aab, aac, aad, aba, abb, abc, ...}
字母表∑的克林闭包(Kleene closure)
字母表∑的闭包(克林闭包):任意符号串(长度可以为零)构成的集合
{a, b, c, d }* = {ε, a, b, c, d,aa, ab, ac, ad, ba, bb, bc, bd, ..., aaa, aab, aac, aad, aba, abb, abc, ...}
串上的运算
连接
- 如果 x和y是串,那么x和y的连接(concatenation)是把y附加到x后面而形成的串,记作xy。 例如,如果 x=dog且 y=house,那么xy=doghouse
- 空串是连接运算的单位元( identity),即,对于任何串s都有,
设x,y,z是三个字符串,如果 x=yz, 则称y是x的前缀,z是x的后缀
幂
串s的幂运算:将n个s连接起来
例:如果 s =ba,那么s1= ba,s2=baba, s3=bababa,...
文法与语言的关系
文法是描述语言的语法结构的形式规则。
例如下图为自然语言句子的构成规则
文法的形式化定义
- VT :终结符集合 终结符是文法所定义的语言的基本符号,有时也称为token。语言中不可再分割的字符串(包括单个字符 组成的串)。注:终结符是组成句子的基本单位
例: VT = { apple, boy, eat, little }
- VN:非终结符集合 非终结符(nonterminal) 是用来表示语法成分的符号, 有时也称为“语法变量”。出现在规则的左部、用<>括起来、表示一定语法概念的词
例: VN = { <句子>, <名词短语>, <动词短语>, <名词>, ... }
- P :产生式集合 产生式( production)描述了将终结符和非终结符组合成串的方法 产生式的一般形式。,读作:α定义为β
- α∈(VT∪VN)+,且α中至少包含VN中的一个元素:称为产生式的头 (head ) 或左部(left side)
- β∈(VT∪VN)* :称为产生式的体(body)或右部(right side)
例:
P =<句子> -><名词短语> <动词短>;<名词短语>=><形容词><名词短语>
产生式的简写:
对一组有相同左部的α产生式
可以简记为:
读作: α定义为β1,或者β2,...,或者βn 。
β1,β2,...,βn称为α的候选式(Candidate)
- S :开始符号
表示所定义的语法范畴的非终结符,开始符号又称为识别符号
符号约定
-
下述符号是终结符
- 字母表中排在前面的小写字母,如a、b、c
- 运算符,如+、*等
- 标点符号,如括号、逗号等
- 数字0、1、. . . 、9
- 粗体字符串,如id、if等
-
下述符号是非终结符
- 字母表中排在前面的大写字母,如A、B、C
- 字母S。通常表示开始符号
- 小写、斜体的名字,如expr、stmt等
- 代表程序构造的大写字母。如E(表达式)、T(项) 和F(因子)
-
字母表中排在后面的大写字母(如X、Y、Z) 表示文法符号(即终结符或非终结符)
-
字母表中排在后面的小写字母(主要是u、v、. . . 、z) 表示终结符号串(包括空串)
-
小写希腊字母,如α、β、γ,表示文法符号串(包括空串)
-
除非特别说明,第一个产生式的左部就是开始符号
有了文法(语言规 则),如何判定一 个词串是否是满足 文法的句子?这就用到了推导和归约
- 句子的推导(派生)-从生成语言的角度
- 句子的归约 -从识别语言的角度
推导 (Derivations)和归约(Reductions)
推导是从开始符号开始,通过使用产生式的右部取代左部,最终能产生语言的一个句子的过程。
最左(右)推导:每次使用一个规则,以其右部 取代符号串最左(右)非终结符,最左推导和最右推导称为规范推导。
归约是推导的逆过程,即,从给定的源语言的句子 开始,通过规则的左部取代右部,最终达到开始符 号的过程。
最左(右)归约是最右(左)推导的逆过程,最左归约和最右归约称为规范归约。
给定文法G=(VT , VN , P , S ),如果 α→β∈P,那么 可以将符号串γαδ中的α替换为β,也就是说,将γαδ 重写(rewrite)为γβδ,记作 γαδ =>γβδ。此时,称文法 中的符号串 γαδ 直接推导(directly derive)出 γβδ
如果α0=>α1,α1=>α2,α2=>α3,...,αn-1=>αn,则 可以记作α0=>α1=>α2=>α3=> ...=>αn-1=>αn,称符 号串 α0经过n步推导出αn,可简记为α0=>n αn
- α =>0 α
- =>+表示“经过正数步推导”
- =>*表示“经过若干(可以是0)步推导”
例子:
用图示化方式表示:
可能会有多种形式,这就用到了语义分析:
句型、句子和语言
句型:从文法的开始符号S开始,每步推导(包括0步推导)所得到的字符串α。记作:S =>* α,α∈(VT∪VN)*,α是G的一个句型
一个句型中既可以包含终结符,又可以包含非终结符,也可能是空串
句子:是仅含终结符的句型。
例如:
语言:由文法G的开始符号S推导出的所有句子构成 的集合称为文法G生成的语言,记为L(G )。
文法规则的扩充表示:
- 提因子:例:把U→ax|ay|az 改写为U→a(x|y|z)
- 重复次数的指定:例:<标识符>→<字母>{<字母>|<数字>}50
- 任选符号:例:<整数>→[+|-]<数字>{<数字>}
元语言符号:
用来说明文法符号之间关系的符号,如,“→”和 “|”称为元语言符号。
文法的分类
- 0型文法 (Type-0 Grammar)
- 1型文法 (Type-1 Grammar)
- 2型文法 (Type-2 Grammar)
- 3型文法 (Type-3 Grammar)
备注:∀:全称量词。表示任意的、所有的等
0型文法(Type-0 Grammar)
无限制文法(Unrestricted Grammar) /短语结构文法 (Phrase Structure Grammar, PSG ) P中产生式α→β其中α∈V+并至少含有一个非终结 符, β∈V* V=VT∪VN
0型语言:由0型文法G生成的语言L(G )
- 识别0型语言的自动机称为图灵机(TM)
- 型文法是对产生式限制最少的文法
- 任何0型语言都是递归可枚举的
- 对0型文法产生式的形式作某些限制,可得到其 他类型文法的定义
1型文法 (Type-1 Grammar)
上下文有关文法(Context-Sensitive Grammar , CSG ),CSG中不包含ε-产生式
产生式的一般形式: α1Aα2 → α1βα2 ( β≠ε )
上下文有关语言(1型语言):由上下文有关文法 (1型文法) G生成的语言L(G )
注: a)1型文法又称为长度增加文法、上下文有关文 法; b)识别1型语言的自动机称为线性界限自动机 (LBA) ; c)1型文法意味着,对非终结符进行替换时 务必考虑上下文,并且,一般不允许替换成ε ,除 非是开始符号产生ε
2型文法 (Type-2 Grammar)
上下文无关文法(Context-Free Grammar, CFG)
产生式的一般形式:A→β
上下文无关语言(2型语言):由上下文无关文法 (2型文法) G生成的语言L(G )
注:a)2型文法对产生式的要求是:产生式左部一定是非终结符,产生式右部可以是VN、VT或ε ;非终结符的替换不必考虑上下文;b)识别2型语言的自动机称为下推自动机(PDA);c)2型文法也称为上下文无关文法。
例:
- S → L | LT
- T → L | D | TL | TD
- L → a | b | c | d |...| z
- D → 0 | 1 | 2 | 3 |...| 9
3型文法 (Type-3 Grammar)
正则文法((Regular Grammar, RG),正则文法能描述程序设计语言的多数单词
正则语言(3型语言):由正则文法 (3型文法) G生成的语言L(G )
注: a)3型文法也称为正规文法RG、右线性文法或左线性文法;b) 3型文法中的产生式要么均是右线性产生式,要么是左线性产生式,不能既有左线性产生式,又有右线性产生式;若所有产生式均是左线性,则称为 左线性文法;若所有产生式均是右线性,则称为右线性文法;c)识别3型语言的自动机称为有限状态自动机
例 (右线性文法)
- 1S→a|b|c|d
- 2 S → aT | bT | cT | dT
- 3 T → a | b | c | d | 0 |1 | 2 |3 |4 |5
- 4 T → aT | bT | cT | dT | 0T | 1T | 2T | 3T | 4T | 5T
3型文法是判断单词是否正确的文法,2型文法是判断句子是否正确的文法。
注意:在词法分析和语法分析中对产生式有限制:
- 不存在P →P产生式
- 产生式中出现的任何非终结符P必须有用。
- 从开始符号S出发,存在推导S →αPβ(0步或者多步骤)
- P必须能推导出终结符串。
四种文法之间的关系
- 逐级限制:
- 0型文法:α中至少包含1个非终结符
- 1型文法(CSG) :|α|≤|β|
- 2型文法(CFG) :α ∈ VN
- 3型文法(RG):A→wB 或 A→w (A→Bw 或A→w)
- 逐级包含
CFG(上下文无关文法) 的分析树
- 根节点的标号为文法开始符号
- 内部结点表示对一个产生式A→β的应用,该结点的标号是此产生式左部A 。该结点的子结点的标号从左到右构成了产生式的右部β
- 叶结点的标号既可以是非终结符,也可以是终结符。从左到右排列叶 节点得到的符号串称为是这棵树的产出( yield )或边缘(f rontier)
分析树是推导的图形化表示
给定一个推导 S =>α1=> α2=>...=> αn ,对于推导 过程中得到的每一个句型αi,都可以构造出一个 边缘为αi的分析树
(句型的)短语
给定一个句型,其分析树中的每一棵子树的边缘称为该句 型的一个短语(phrase)
如果子树只有父子两代结点,那么这棵子树的边缘称为该句 型的一个直接短语(immediate phrase)
例:
二义性文法 (Ambiguous Grammar)
如果一个文法可以为某个句子生成多棵分析树, 则称这个文法是二义性的
例1
例2
二义性文法的判定:
对于任意一个上下文无关文法,不存在一个算法, 判定它是无二义性的;但能给出一组充分条件, 满足这组充分条件的文法是无二义性的
- 满足,肯定无二义性
- 不满足,也未必就是有二义性的