1. 梳理第二章的内容,写一篇理解与总结。
1.什么是文法?第二章的历程已经渐渐揭过,再来回顾一下这个问题,感觉好像从一无所知的幼年蒙童变成了一位稚嫩少年,那么什么是文法呢?
文法是对语言结构的定义与描述,即从形式上描述和规定语言结构,也称为语法。任何一个文法都可以表示为一个四元组G=(VT,VN,S, φ ) VT是一个非空的有限集合,它的每个元素称为终结符号。 VN是一个非空的有限集合,它的每个元素称为非终结符号。 VT∩VN =φ S是一个特殊的非终结符号,称为文法的开始符号。 φ 是一个非空的有限集合,它的每个元素称为产生式。
2.语言:在某一确定字母表上的特定符号串的集合。
3:文法的书写约定:
终结符号 次序靠前的小写字母,
如:a、b、c 运算符号,如:+、-、*、/
各种标点符号,如:括号、逗号、冒号、等于号 数字1、2、…、9
黑体字符串,如:id、begin、if、then
非终结符号 次序靠前的大写字母,如:A、B、C
大写字母S常用作文法的开始符号小写的斜体符号串,如:expr、term、factor、stmt
文法符号 次序靠后的大写字母,如:X、Y、Z
终结符号串 次序靠后的小写字母,如:u、v、…、z
文法符号串 小写的希腊字母,如:α、β、γ、δ
可以直接用产生式的集合代替四元组来描述文法,第一个产生式的左部符号是文法的开始符号。
4.短语、直接短语和句柄:对于文法G=(VT,VN,S, φ ),假定αβδ是文法G的一个句型,如果存在
S =*>αAβ,并且 A =+>β,则称β是句型αβδ关于非终结符号A的短语。 如果存在:S =*>αAβ,并且 A =>β
则称β是句型αβδ关于非终结符号A的直接短语。 一个句型的最左直接短语称为该句型的句柄。
分析树:推导的图形表示,又称推导树。 一棵有序有向树,因此具有树的性质; 分析树的特点:每一个结点都有标记。 根结点由文法的开始符号标记; 每个内部结点由非终结符号标记,它的子结点由这个非终结符号的这次推导所用产生式的右部各符号从左到右依次标记; 叶结点由非终结符号或终结符号标记,它们从左到右排列起来,构成句型。
子树:分析树中一个特有的结点、连同它的全部后裔结点、连接这些结点的边、以及这些结点的标记。 子树的根结点的标记可能不是文法的开始符号。 如果子树的根结点标记为非终结符号A,则可称该子树为A-子树。
子树与短语的关系:一棵子树的所有叶结点自左至右排列起来,形成此句型相对于该子树根的短语; 分析树中只有父子两代的子树的所有叶结点自左至右排列起来,形成此句型相对于该子树根的直接短语; 分析树中最左边的那棵只有父子两代的子树的所有叶结点自左至右排列起来,就是该句型的句柄。
二义性:如果一个文法的某个句子有不止一棵分析树,则这个句子是二义性的句子。 含有二义性句子的文法是二义性的文法。二义性问题是不可判定的 不存在一种算法,它能够在有限的步骤内确切地判定出一个文法是否是二义性的。 可以找出一些充分条件(未必是必要条件),当文法满足这些条件时,就可以确信该文法是无二义性的。
文法二义性的消除:映射程序设计语言中IF语句的文法: stmt if expr then stmt | if expr then stmt else stmt | other 句子if E1 then if E2 then S1 else S2有两棵不同的分析树。利用“最近最后匹配原则”:else必须匹配离它最近的那个未匹配的then。 出现在then和else之间的语句必须是“匹配的”。 所谓匹配的语句是不包含不匹配语句的if-then-else语句,或是其他任何非条件语句。改写后的文法: stmtmatched_stmt | unmatched_stmt matched_stmtif expr then matched_stmt else matched_stmt | other unmatched_stmt if expr then stmt | if expr then matched_stmt else unmatched_stmt
2. 尝试写出PL/0 语言的文法。
整数n:设文法G(T):T->NT
N->0|1|2|3|...|9
标识符i:<标识符> ::= <字母>{<字母>|<数字>}
表达式e:<表达式> ::= [+|-]<项>{<加法运算符><项>}
条件语句:<条件语句> ::= if<条件>then<语句>[else<语句>]
赋值语句:<赋值语句> ::= <标识符>:=<表达式>
复合语句:<复合语句> ::= begin<语句>{;<语句>}end
函数:<函数定义>::=<类型说明><函数名><复合语句>
程序:<程序> ::= <分程序>.