1. 梳理第二章的内容,写一篇理解与总结。
符号和符号串
正如我们学习的English是由单词和标点符号构成的,单词又是有字母构成的,计算机语言也是如此,也是由字母和数字等一些基本符号构成的,一个源程序就是一个“基本符号串”,所以我们开始了解符号和符号串相关的定义。
字母表:
元素的非空有穷集合。不同的语言有他自己不同的字母表,我们的计算机语言字母表就是数字,字母,标点等若干符号了。中文的字母表就是汉字了。
符号串:
字母表的符号组成任何又穷序列的符号串。例如字母表A={a,b,c}则由这个字母表组成的符号串包括: {ab,ac,bc,abc,a,b,c}。
语言:
在某一确定字母表上的特定符号串的集合。
文法及其形式定义
规则:重写规则、产生式或生成式
文法:所谓文法就是描述语言的语法结构的形式规则。
任何一个文法都可以表示为一个四元组G=(VT,VN,S, φ) VT是一个非空的有限集合,它的每个元素称为终结符号。 VN是一个非空的有限集合,它的每个元素称为非终结符号。( VT∩VN =φ)S是一个特殊的非终结符号,称为文法的开始符号。 φ是一个非空的有限集合,它的每个元素称为产生式。
文法的类型:
0型文法(无限制文法或短语结构文法)包括所有的文法。该类型的文法能够产生所有可被图灵机识别的语言。可被图灵机识别的语言是指能够使图灵机停机的字串,这类语言又被称为递归可枚举语言。注意递归可枚举语言与递归语言的区别,后者是前者的一个真子集,是能够被一个总停机的图灵机判定的语言。
1型文法(上下文相关文法)生成上下文相关语言。这种文法的产生式规则取如 αAβ -> αγβ 一样的形式。这里的A 是非终结符号,而 α, β 和 γ 是包含非终结符号与终结符号的字串;α, β 可以是空串,但 γ 必须不能是空串;这种文法也可以包含规则 S->ε ,但此时文法的任何产生式规则都不能在右侧包含 S 。这种文法规定的语言可以被线性有界非确定图灵机接受。
2型文法(上下文无关文法)生成上下文无关语言。这种文法的产生式规则取如 A -> γ 一样的形式。这里的A 是非终结符号,γ 是包含非终结符号与终结符号的字串。这种文法规定的语言可以被非确定下推自动机接受。上下文无关语言为大多数程序设计语言的语法提供了理论基础。
3型文法(正规文法)生成正规语言。这种文法要求产生式的左侧只能包含一个非终结符号,产生式的右侧只能是空串、一个终结符号或者一个非终结符号后随一个终结符号;如果所有产生式的右侧都不含初始符号 S ,规则 S -> ε 也允许出现。这种文法规定的语言可以被有限状态自动机接受,也可以通过正则表达式来获得。正规语言通常用来定义检索模式或者程序设计语言中的词法结构。
推导和短语
假定A→γ是一个产生式,α和β是任意的文法符号串,则有: αAβ=>αβ
“=>” 表示 “一步推导” 即利用产生式对左边符号串中的一个非终结符号进行替换,得到右边的符号串。
最左推导(α=>β):在每次一步推导中,都替换α中最左边的非终结符号
最右推导(α=>β):在每次一步推导中,都替换α中最右边的非终结符号,也称为规范推导
句型、句子和语言
对于文法G=(VT,VN,S,φ),如果S=>α,则称α是当前文法的一个句型。
句子 :仅含有终结符号的句型是文法的一个句子。
语言:文法G产生的所有句子组成的集合是文法G所定义的语言,记作L(G)。
短语、直接短语和句柄
对于文法G=(VT,VN,S,φ),假定αβδ是文法G的一个句型,如果存在:S=>*αAδ,并且 A=>+β,则称β是句型αβδ关于非终结符号A的短语;如果存在:S=>*αAδ,并且 A=>β,则称β是句型αβδ关于非终结符号A的短语。
一个句型的最左直接短语称为该句型的句柄。
分析树
推导的图形表示,又称推导树。一棵有序有向树,具有树的性质。
特点:每一个结点都有标记。 根结点由文法的开始符号标记; 每个内部结点由非终结符号标记,它的子结点由这个非终结符号的这次推导所用产生式的右部各符号从左到右依次标记; 叶结点由非终结符号或终结符号标记,它们从左到右排列起来,构成句型。
子树与短语的关系
一棵子树的所有叶结点自左至右排列起来,形成此句型相对于该子树根的短语; 分析树中只有父子两代的子树的所有叶结点自左至右排列起来,形成此句型相对于该子树根的直接短语; 分析树中最左边的那棵只有父子两代的子树的所有叶结点自左至右排列起来,就是该句型的句柄。
二义性
如果一个文法的某个句子有不止一棵分析树,则这个句子是二义性的句子。 含有二义性句子的文法是二义性的文法。
如果两个文法产生的语言相同,即L(G)=L(G’),则称这两个文法是等价的。 有时,一个二义性的文法可以变换为一个等价的、无二义性的文法。 有些语言,根本就不存在无二义性的文法,这样的语言称为二义性的语言。 二义性问题是不可判定的。
2. 尝试写出PL/0 语言的文法。
整数n n::=0|1|2|3|4|5|6|7|8|9|....
标识符i i::=1|2|3|..|a|b|c|d|...
表达式e e::=[+|-]r{+|- r} 项r::=y{ *|/ y} 因子y y::=i|n|(e)
条件语句 if A then B
赋值语句 i : = e
复合语句 begin A { ;b} end
函数
type_specifier à
VOID
| CHAR
| INT
| FLOAT
程序 <程序> -> <分程序>
<分程序> -> [<常量说明部分>][<变量说明部分>][<过程说明部分>]<语句>
<常量说明部分> -> CONST<常量定义>{ ,<常量定义>};