【形式化的方法】是用一整套带有严格规定的符号体系来描述问题的方法。
[重点介绍如何采用形式化的方法描述程序设计语言]
【形式语言】序列的集合称为形式语言。
[每个形式语言都是某个字母表上按某种规则构成的所有符号串的集合]
[任何一个字母表上符号串的集合均可定义为一个形式语言]
[形式语言是指不考虑语言的具体意义,即不考虑语义]
[对形式语言的描述有两种方法,一种方法是当语言为有穷集合时,用枚举法来表示语言]
[当语言为无穷集合时,就要用语法来描述语言了。 ]
例如A={ a, b, c }
L1={ a, b, c }
L2={ a, aa, ab, ac }
L3={ c, cc }//有穷集合
L={ 0, 1 } { 0, 1 }*
= { 0, 1, 00, 10, 11, 01, 000, 100, …} //无穷集合
符号“->”读作“生成”或“由…组成”
【产生式】是一个符号与一个符号串的有序对(A,β),写作:A→β
[ 产生式的作用是告诉我们如何用产生式中的符号串生成语言中的序列]
例如(1)串110是从A→A0 → A10 → 110产生的【倒推生成】
[ 产生式中出现的符号分为两类,一类是终结符号,另一类是非终结符号。]
[ 非终结符号是出现在规则左部能派生出符号或符号串的那些符号,即每个非终结符号表示一定符号串的集合,用大写字母表示或用尖括号把非终结符号括起来。例如,上例中的A。]
2【语法】产生式的非空有穷集合,通常表示成四元组
G={VN,VT, P, S }
VN是产生式中非终结符号的集合。
VT是产生式中终结符号的集合。
P 是产生式的集合。
A→a1 | a2 | … | an 【缩写形式】
其中每个ai有时也称为是A的一个候选式。
注:语法是不唯一的
【表达式E】若 E1和 E2是算术表达式, 则E1+E2、E1*E2、(E1) 也是算术表达式
【语言的形式推导】推导用“=>”
1、直接推导:推导的依据是产生式。
S=>0S1——【句型】——含终结符[句型包括句子]
S=>0011——【句子】——不含终结符
约定:
第一条规则的左部是开始符号。
对语法G不用四元式显示表示,仅只将产生式写出。
分为【最左最右推导】最右比最左简单
【归约】
【递归产生式】
如果语法中有产生式,A→A … 称为左递归。
如果语法中有产生式, A→ … A 称为右递归。
如果语法中有产生式,A→ …A… 称为递归。
[在语法中使用递归,使得我们能用有限的产生式去定义无穷集合的语言。]
【推导和语法树】
对句型的推导过程给出一种图形表示, 这种表示称为语法树,也称推导树。
[作用:语法树是用来描述句型(句子)语法结构的一种辅助工具。]
[一棵语法树表示了一个句型的种种可能的(但未必是所有的)不同推导过程, 包括最左(最右)推导]
如果一个语法存在某个句子对应两棵不同的语法树,则说这个语法是【二义性】的
若一个语法中存在某个句子,它有两个不同的最左 (最右) 推导,则这个语法是二义性的。
【语法二义性的消除】
1. 不改变语法中原有的语法产生式, 仅加进一些非形式的语法规定
2. 构造一个等价的无二义性语法。即把排除二义性的产生式合并到原有语法中,改写原有的语法。
将运算符的优先顺序和结合规则:*优先于+; +、*左结合加到原有语法中, 可构造出无二义性语法如。【难点】
【短语】总是句型的某个子串,它对应子树未端结点形成的符号串。
【直接短语】是某条规则右部,它对应简单子树未端结点形成的符号串。
最左边的直接短语是【句柄】。