文法是用来定义语言的一个模型,常用的文法体系为Chomsky文法体系。
文法定义
文法G(Grammar)是一个四原组,G=(N,T,P,S),N(Non-terminator)是非终结符集合,T(Terminator)是终结符集合,P(Production)是产生式集合,S(Start)是起始符
其中:
N 交 T = 空集
P 是形式为 α -> β 的产生式
α ∈ (N∪T)*N+(N∪T)*,也就是说α中必须有一个非终结符
β ∈ (N∪T)* ,也就是说β可以是空串
S∈N
分类
1型文法 又称上下文有关文法。生成式形式为 α->β, 且 |α| < |β| 并且不存在 A->ε
2型文法 又称上下文无关文法。生成式形式为 A->α,即左边必须只有一个非终结符
3型文法 又称正则文法。
生成式 A->wB或A->w,称为右线性文法
生成式 A->Bw或A->w,称为左线性文法
0型文法 对生成式没有任何限制的文法称为0型文法。从0到3都是包含的关系,但是有特例,包含 A->ε 产生式的2,3型文法不属于1型文法。
四种文法产生的语言分别称为 上下文有关语言,上下文无关语言,正则语言,无限制性语言。
2型语言的表示法
2型语言是很重要的一种语言,除了用四元组的方法表示,此处再介绍两种表示方法。
当人们要解释或者讨论程序设计语言本身时,经常又需要一种语言,被讨论的语言叫做对象语言,即某种程序设计语言,讨论对象语言的语言称为元语言,即元语言是描述语言的语言。BNF范式通常被作为讨论某种程序设计语言语法的元语言,而语法图是与BNF范式的描述能力等价的另一种文法表示形式,因其直观性而经常采用。
(1)巴科斯范式(Backus Normal Form,BNF)
2型文法生成式左端只有一个非终结符,所以可以把左端相同的生成式合并在一起,右端用|隔开,用::=代替->,所有非终结符用<>括起来,这是Backus为了描述AIGOL语言首次提出并使用的。
用BNF描述十进制整数的生成语法:
<无符号整数> ::= <数字>|<数字><无符号整数>
<数字> ::= 0|1|2|3|4|5|6|7|8|9
(2)语法图
语法图有四种基本形式
(3)推导树
2型文法还经常用推导树表示