文法是什么?
文法就是起描述的元语言,通过元语言可以判断句子结构是否符合规范,也就是说,根据一些规则,来确定编程语言的语法,从而实现编译器的功能,不然编译器怎么知道我们写的程序语句是什么意思呢
语言:
语义(Semantics):单个元素的含义
语法(Syntax):各个元素之间的组合规律
语用(Pragmatics):语句和使用者之间的关系
文法是由非终结符(大写字母)和终结符(小写字母)和"->"组成的,比如:
H->a、W->hbq,Q->Cq,hdQ->d
非终结符(大写字母,一般用S,标识Start)一般是写在左边,终结符(小写字母)一般是写在右边
文法分类:
前提:一个组合G=(Vn,Vt,P,S)分别表示非终结符的集合,终结符的集合,推导式的集合,开始符
如上述的H、W、Q是Vn,a、hbq、b是Vt,整个的集合是P
0型文法:
最简单的一个文法,没有那么多的限制条件。左边必须要包含这些元素或者元素组合中的至少一个非终结符,右边可以是这些元素的任意组合,这就是0型文法。文法至少是一个0型文法,如:
H->a
1型文法(上下文有关文法):
在0型文法的基础上加了个要求:右边的长度>=左边的长度(终结符或非终结符的个数)如:
H->a、W->hbq,Q->Cq,而hdQ->d则不符合
另外:S->ε(ε表示空)也是1型文法
2型文法(上下文无关文法):
在1型文法的基础上又加了个要求:左边必须是非终结符(个数无限制)如:
HWQ->fdasf
3型文法(正规文法):
没错,就是在2型文法基础上加要求:可以是非终结符->一个终结符,也可以是一个非终结符->终结符且带一个非终结符。注意这里两个可以是”或“的意思,如:
H->a|aB;H->a|Ba
用分号隔开,这两种是相互独立的,如:
H->a,H->aB,H->Ba这三个组合就不是3型文法了,因为要么全是H->a|aB这种类型的,要么全是H->a|Ba这种类型的