文法的类型是自从乔姆斯基建立的描述,他把文法分成4种类型,即0型(文法)、1型(上下文有关的)、2型(上下文无关的)和3型(正规文法)。这几类文法的差别在于对产生式施加不同的限制。他的定义是令G是一个文法,S是文法的开始符号,abo的是文法G的一个句型。如果有S-*→aAo且(A-+→b测标b是句型abo相对于非终结符A的短语。特别地,如果有(A→β是句型abo相对于规则A→b的直接短语(也称简单短语)。一个右句型的直接短语称为该句型的句柄。句柄的概念只适合于右句型。
句型的分析是对于上下文无关文法,语法树是句型推导过程的几何表示。语法树确实将所给句型的结构很直观地显示出来了。语法树是句型结构分析的极好工具。而这里所说的句型分析问题,是说如何知道所给定的符号串是文法的句型。句型的分析就早识别一个符号串是否为某文法的句型,是某个推导的构造过程。进一步说,当给定一个符号串时,试图按照某文法的规则为该符号串构造推导或语法树,以此识别出它是该文法的一个句型;当符号串全部由终结符号组成时,就是识别它是不是某文法的句子。因此也有人把语法树称为语法分析树或分析树。对于程序设计语言来说,要识别的是程序设计语言的程序,程序是定义程序设计语言的文法的句子。句型分析是一个识别输入符号串是否为语法十正确的程序的过程。在语言的编译实现中,把完成句型分析的程序称为分析程序或识别程序,分析算法又称识别算法。
2. 尝试写出PL/0 语言的文法。(或者你认为比较好的语言规则)
整数n
标识符i
表达式e
条件语句
赋值语句
复合语句
函数
程序
...
整数n <数字> => 0|1|2…7|8|9
标识符i <标识符> → <字母>{<字母>|<数字>}
表达式e <表达式> → [+|-]<项>{<加减运算符><项>}
条件语句 <条件语句> → if<条件>then<语句>
赋值语句 <赋值语句> → <标识符>:=<表达式>
复合语句 <复合语句> → begin<语句>{;<语句>}end
赋值语句 <赋值语句> → <标识符>:=<表达式>
程序 〈程序〉→〈分程序〉.
〈分程序〉→ [<常量说明部分>][<变量说明部分>][<过程说明部分>]〈语句〉