- 梳理第二章的内容,写一篇理解与总结。
我们学习了符号串、句子、语法树、短语、直接短语、文法、最左推导、最右推导、语言、二义性。
符号串知识
(1)字母表. 符号的非空有限集合。典型的符号是字母、数字、各种标点和运算符等。
(2)符号串.定义在某一字母表上,由该字母表中的符号组成的有限符号序列。
符号串集合幂运算: A0=εA0=ε, A1=AA1=A, A2=AAA2=AA, ...
符号串集合闭包运算。正闭包: A+=A1∪A2∪A3∪...A+=A1∪A2∪A3∪...。闭包: A∗=A0∪A+A∗=A0∪A+。
句子
仅含有终结符号的句型是文法的一个句子。语法树从左至右终结符序列,是句型的一个特例。Z =+> x。对于文法G=(VT,VN,S,φ),如果,则称α是当前文法的一个句型。
语法树
语法树是句子结构的图形表示,它代表了句子的推导结果,有利于理解句子语法结构的层次。简单说,语法树就是按照某一规则进行推导时所形成的树。分析树的特点:每一个结点都有标记。根结点由文法的开始符号标记; 每个内部结点由非终结符号标记,它的子结点由这个非终结符号的这次推导所用产生式的右部各符号从左到右依次标记;叶结点由非终结符号或终结符号标记,它们从左到右排列起来,构成句型。
短语、直接短语
短语判断
一个句型的语法树中任一子树叶节点所组成的符号串都是该句型的短语。很明显的,最下面的a是S的叶子节点、最左边的S是L的叶子节点。其他的叶子节点从左往右分别是(,,,(,),)在树的第四层的(,L,)都是子树S的孩子,因为短语都是叶子节点,所以这边的短语有(a)在树的第三层的L,,,S都是子树L的孩子,因为短语都是叶子节点,所以这边的短语有S,(a)在树的第二层的(,L,)都是根节点S的孩子,因为短语都是叶子节点,所以这边的短语有(S,(a)),所以短语有a (a) S,(a) (S,(a)) S。
判断直接短语
短语包含直接短语,我们可以直接在短语中判断。这里只有第五层的S和第三层的L不包含其他更下的子树,所以有a和S是直接短语。其中(a)的父节点S包含L,S,(a)的父节点L包含L和S, (S,(a))的父节点S包含L。
文法
文法是对语言结构的定义与描述。即从形式上用于描述和规定语言结构的称为"文法"(或称为"语法")。
文法定义四元组:G=(Vn,Vt,P,Z)G=(Vn,Vt,P,Z)。VnVn为非终结符号集,VtVt为终结符号集,二者统称字汇表(V);P为产生式(规则)集合;Z为开始符号(识别符号)。
最左推导:如果 a=>b,并且在每“一步推导”中,都替换a中最左边的非终结符号,则称这样的推导为最左推导。
最右推导:也称规范推导,如果 a=>b,并且在每“一步推导”中,都替换a中最右边的非终结符号,则称这样的推导为最右推导。
二义性文法(不可推)
文法所定义的某个句子存在两棵不同的语法树。
文法中存在某个句子,它有两个不同的规范(最右)推导。
文法中存在某个句子,它有两个不同的规范(最左)规约,即在规约中某些规范句型的句柄不唯一。
2. 尝试写出PL/0 语言的文法。(或者你认为比较好的语言规则)
整数n
<数字> ::= 0 | 1 | 2 | … | 8 | 9
标识符i
<标识符> ::= <字母> {<字母>|<数字>}
表达式e
<表达式> ::= [+ | -] <项> { <加法运算符><项>}
条件语句
::=if<条件>then<语句> ::= <表达式> <关系运算符> <表达式> | ODD <表达式>
赋值语句
<赋值语句> -> <标识符> := <表达式>
复合语句
::= BEGIN <语句> {;<语句>} END
函数
type_specifier a
VOID
|CHAR
|INT
|FLOAT
程序
<程序>-><外部声明> | <外部声明><函数>
<外部声明>-><头文件><函数声明> | <其他声明>
<函数>-><返回值类型><标识符><形参><复合语句>