文法的等价性
G(N),N->... 第一个产生式左边的符号往往是起始符号
借助有限个产生式和符号表述整个语言
V*={V_N^*,V_T^*}不等于V_N^*∪V_T^*
推导
直接推导?+推导?使用若干次产生式的使用
*推导:在+推导基础上加上0次可以推导的情况
最右推导?先把最右边的完成,再扩展,完成最右边的,最后完成整个推导。可以写成N-+->109,表示N通过多步推导形成109。也称规范推导。同理有最左推导。
来个例子:
直接规约,多步规约。
推导的逆过程称为规约。
证明某一句话是某个文法的句子,可以用规约也可以用推导。
N是句型:因为*包含0次使用产生式。句型:终结符非终结符,句子:终结符!
D09(句型)没有最左推导(就是一直左推导,不存在左右混合推导),不是所有的句型都有最左推导和最右推导,所有句子都有最左、最右推导。
L(G)=L(G'),则G和G'为等价文法。
PL0
以常量说明部分为例:const 定义,定义,...,定义;
这个定义是:id=整数,通过下面变量说明可推出id就是给变量/常量起的名字。
所以const 常量名=整数,常量名=整数……;
用终结符替换,最终可推导出赋值语句,以下图为例:
注意:PL0变量var只能是整型。
赋值语句文法G(S):
注意终结符集和非终结符集!
递归
B->Bb|b 左递归,记住原本的在左边(如B)就是左递归。
文法具有等价性。文法的递归性决定了其能够定义无限句子。
左递归文法的缺点,不能用自顶向下的方法进行语法分析,会产生死循环
文法的分类
语言是文法所有句子的集合
上下文有关,一定要是上下文,少一边都不行。
Wt/tW,都只能是一个字符,一共就一个或者两个字符。而且只有左线性和右线性,没有左右线性。必须至少保证非终结符能够推出终结符。
所有的计算机高级语言都可以使用二型文法和三型文法定义。
产生式左边只有一个非终结符号:上下文无关文法,否则考虑上下文有关文法。
正则文法用于词法分析,上下文无关文法用于语法分析。
语句是由终结符集合构成,由终结符集合构成的不一定是语句:i=)i+i)就不是赋值语句。
赋值语句的递归性在于表达式E。
在计算机科学中,文法(Grammars)按照其表达能力和形式约束可以被分类为0型、1型、2型和3型。这些文法类别基本上是层次结构,也就是说,高层次的文法有更强的表达能力但也有更少的约束。
- 0型文法(无约束文法):没有任何限制。
- 1型文法(上下文有关文法):产生式的左侧可以是多个符号,且长度可以与右侧不同。
- 2型文法(上下文无关文法):产生式左侧必须是单一的非终结符。
- 3型文法(正则文法):产生式的形式更为受限。
每一种文法都对应一个或多个“语言”(也就是一组字符串的集合),这些语言由该文法的产生式生成。与这些文法类型相对应,也有一组语言类别,分别是:L0、L1、L2和L3。L0是最强大的,包含所有由0型文法生成的语言;L1包含所有由1型文法生成的语言,依此类推。
-
0型文法可以产生L0、L1、L2、L3:0型文法的表达能力是最强的,它可以生成任何其他类型文法所能生成的语言。
-
但2型文法只能产生L2、L3,不能产生L1:这意味着2型文法(上下文无关文法)不能生成所有1型文法(上下文有关文法)所能生成的语言。它的表达能力相对较弱。
这样的分类在理解编程语言、解析器和编译器设计等多个方面是非常有用的。一般而言,越高级的文法越有表达能力,但也越难以解析;而越低级的文法则相对容易解析,但其表达能力有限。
语法树与二义性文法
不能在有限步骤内证明文法不具有二义性!
通过规范推导或规范归约所得到的句型称为规范句型
若对于一个文法的某一句子存在两棵不同的语法树,则该文法是二义性文法,否则是无二义性文法。
文法的二义性:能够使用多种语法树描述其语法规则: