1. 梳理第二章的内容,写一篇理解与总结。
本章重点介绍了语言的语法结构的形式描述、语法树以及文法的二义性
1.设计一个文法定义一个已知的语言
(1)文法是一个四元组G=(V,V,P,S),文法四大要素中,关键是一组规则,它定义(或描述)了一个语言的结构。从文法定义可知,文法对于程序设计者来说,文法给出了语言的精确定义和描述。
(2)分析已知语言句子的结构特征,设计出相应的一组规则,但不唯一。
(3)设计的文法必须能定义已知的语言,不能超出或缩小所定义语言的范围。
(4)若语言是无穷集合,设计该语言的文法一定是递归的。
2.已知一个文法,确定该文法所定义的语言。
(1)文法所定义的语言L(G[S])={x|S→当x且x∈VT*}
(2)给定一个文法,可根据语言和推导定义推导出文法的句子,从而确定出该文法所定义的语言
(3)语言可用
①自然语言描述。
例如,L={xx∈{a,b}+且x中a,b个数相同}
②式子描述。例如L={a2bbn>아。
③正规式描述。
3.求句型的短语、直接短语和句柄
(1)短语、直接短语和句柄是对某句型而言的。
(2)短语总是句型的某个子串,它对应子树未端结点形成的符号串。
(3)直接短语是某条规则右部,它对应简单子树未端结点形成的符号串。
(4)最左边的直接短语是句柄。
4.文法二义性的判断一个文法存在某个句子对应两棵不同的语法树或对应两个不同的最左(最右)推导,则该文法是二义性的。
2. 尝试写出PL/0 语言的文法。(或者你认为比较好的语言规则)
整数n:n :: = 1 | 2 | ..... | 9 | 0
标识符i: i :: = <字母> | {<字母> | <数字 >}
表达式e :e ::= [+|-]<项>{<加减运算符><项>}
条件语句:<条件语句> ::= if<条件>then<语句>
赋值语句:<赋值语句> ::= <标识符>:=<表达式>
复合语句:<复合语句> ::= begin<语句>{;<语句>}end
函数:<函数> ::= <类型说明><函数名><复合语句>
程序:<程序> ::= [<常量说明部分>] [<变量说明部分>] [<过程说明部分>] <语句>