1. 梳理第二章的内容,写一篇理解与总结
在第二章学习主要学习了语法规则,以下为总结的本章的一些词语解释
最左推导:如果在推导的任何一步@=>B,其中@、B是句型,都是对@中的最左非终结符进行替换,则称这种推导为最左推导。
最右推导:与最左推导相反。
语法树:推导的图形表示,又称推导树。
二义性:如果一个文法存在某个句子对应两棵不同的语法树,则说这个文法是二义。含有二义性句子的文法是二义性的文法。有些语言,根本就不存在无二义性的文法,这样的语言称为二义性的语言。
短语:一棵子树的所有叶结点自左至右排列起来,形成此句型相对于该子树根的短语。
直接短语:分析树中只有父子两代的子树的所有叶结点自左至右排列起来,形成此句型相对于该子树根的直接短语。
句柄:分析树中最左边的那棵只有父子两代的子树的所有叶结点自左至右排列起来,就是该句型的句柄。
规则:形如α→β或α::=β的(α,β)有序对,其中α称为规则的左部,β称作规则的右部。这里使用的符号→(::=)读作“定义为”。例如A→a读作“A定义为a”。也把它说成是一条关于A的规则(产生式)。
句型:对于文法G=(VT,VN,S,φ),如果S=>@,则称@是当前文法的一个句型。
句子:仅含有终结符号的句型是文法的一个句子。
语言:文法G产生的所有句子组成的集合是文法G所定义的语言。
0型文法:0型文法(PSG): α∈(VN∪VT)* ,且至少含一个VN,β∈(VN∪VT)*,0型文法也称为短语文法。一个非常重要的理论结果是,0型文法的能力相当于图灵机(Turing)。或者说,任何0型语言都是递归可枚举的;反之,递归可枚举集必定是一个0型语言。
上下文有关文法: 对任一产生式α→β,都有|β|>=|α|, 仅仅 S→ε除外,产生式的形式描述:α1Aα2→α1βα2 (其中,α1、α2、β∈(VN∪VT)*,β≠ε,A∈VN),即:A只有出现在α1α2的上下文中,才允许用β替换。产生的语言称“上下文有关语言”。
上下文无关文法:对任一产生式α→β,都有α∈VN,β∈(VN∪VT)*,产生式的形式描述:A→β(A∈VN),即β取代A时,与A所处的上下文无关。产生的语言称“上下文无关语言”。
正规文法:每个产生式均为 “A→aB”或“A→a” —— 右线性、“A→Ba”或“A→a” —— 左线性,其中,A、B∈VN,a∈VT*,产生的语言称“正规语言”。
2. 尝试写出PL/0 语言的文法。(或者你认为比较好的语言规则)
整数n
标识符i
表达式e
条件语句
赋值语句
复合语句
函数
程序
...
(1)
n :: = [-]{<非零数字>}<数字>
<非零数字>:: = 1|2|...|8|9
<数字>:: = 0|1|2|...|8|9
(2)
i::=<字母> | {<字母> | <数字>}
<字母>::=a|b|c|...|X|Y|Z
<数字>::=0|1|2|...|8|9
(3)
e ::= [+|-]<项>{<加减运算符><项>}
<项> ::= <因子>{<乘除运算符><因子>}
<加减运符> ::= +|-
<因子>::= <标识符>|<无符号整数>|’(‘<表达式>’)’
<乘除运算符>::= *|/
<标识符>::= <字母>{<字母>|<数字>}
<无符号整数>::={<数字>}<数字>
<数字>:: = 0|1|2|...|8|9
<字母>:: = a|b|c|...|X|Y|Z
(4)
<条件语句> → if<条件>then<语句>
(5)
<赋值语句>::=<标识符>:=<表达式>
(6)
<复合语句>::=begin<语句>{;<语句>}end
(7)
<函数> ::= <类型说明><函数名><复合语句>
(8)
<程序>::=<分程序>
<分程序>::=[<常量说明部分>][<变量说明部分>][<过程说明部分>]<语句>
<常量说明部分>::=const<常量定义>{ ,<常量定义>};
<常量定义>::=<标识符>=<无符号整数>
<变量说明部分>::=var<标识符>{ ,<标识符>};
<过程说明部分::=<过程首部><分程序>;{<过程说明部分>}
<过程首部>::=procedure<标识符>;