1.梳理第二章的内容,写一篇理解与总结。
(1)文法的形式定义
所谓文法就是描述语言的语法结构的形式规则。
任何一个文法都可以表示为一个四元组G=(VT,VN,P,S)
其中VT是一个非空有限集,它的每个元素称为终结符号
VN是一个非空有限集,它的每个元素称为非终结符号(VT和VN的交集为空)
S是一个非终结符号,称为开始符号
P是一个产生式集合(有限),每个产生式的形式是P-->a
开始S必须在某个产生式的左部出现一次
终结符指组成语言的基本符号(如基本字、标识符、常数、算符、界符)
非终结符号(也称语法变量)表示一定符号串的集合。
(2)文法的类型(文法分为0 型,1 型 ,2 型,3 型四种类型)
0 型文法(短语文法):0 型文法所有产生式的左部 α 和右部 β 都是符号串,对它们没作任何限制。即产生式的左部至少有一个非终结符右边随意。若对0 型文法的产生式作某些限制,则可以给出其他三种类型的文法。
1 型文法(上下文有关文法):1型文法所有产生式左部可以含有一个、两个或两个以上的字符,但其中必须至少有一个非终结符。产生式右部的符号串的长度必须大于等于左边符号串的长度。对于产生式 “S→ε”是1 型文法中的一个特例。
2 型文法(上下文无关文法 | 左线性文法):2 型文法的所有产生式左部是单个非终结符,右部是由终结符和非终结符组成的符号串。
3 型文法(右线性文法 | 正规文法):3 型文法所有的产生式右部是单个终结符或单一终结符后跟着单一非终结符。产生式右部符号串长度小于等于2。
四种文法之间的关系:
(3)语言
推导:从开始符号出发,每个重写步骤把一个非终结符号替换为它的某个产生式体。
最左推导:总是选择每个句型的最左非终结符号。
最右推导:总是选择每个句型的最右非终结符号。
语法树:一种描述上下文无关文法的句型推导的直观工具,也称推导树。
文法的二义性:如果一个文法存在某个句子对应两棵不同的语法树,则说这个文法是二义的。
(4)句型的分析
句型:对于文法G=(VT,VN,S,P),如果S推导出a,则称a是当前文法的一个句型。
句子:仅含有终结符号的句型是文法的一个句子。
短语:一个句型的语法树中任一子树叶结点所组成的符号串都是该句型的短语。
直接短语:子树中不再包含其他的子树,即A只能推导出b,而b不能再推出其他的式子,则b为此句型的直接短语。
句柄:直接短语中的最左直接短语为该句型的句柄。
2. 尝试写出PL/0 语言的文法。(或者你认为比较好的语言规则)
(1)EBNF表示的符号说明。
‘< >’用左右尖括号括起来的中文字表示语法构造成分,或称语法单位,为非终结符。‘::=’该符号的左部由右部定义,可读作“定义为”。
‘|’表示“或”,为左部可由多个右部定义。
‘{ }’表示花括号内的语法成分可以重复。在不加上下界时可重复0到任意次数,有上下界时为可重复次数的限制。
‘[ ]’表示方括号内的成分为任选项。
‘( )’表示圆括号内的成分优先。
上述符号称“元符号”,定义文法用到上述符号作为文法符号时需要引号‘’括起。
(2)PL/0语言文法的EBNF表示:
整数n:<n>::=0|1|2|……|8|9
标识符i:<标识符>::=<字母>{<字母>|<数字>}
表达式e:<表达式>::=[+|-]<项>{<加法运算符><项>}
<项>::=<因子>{<乘法运算符><因子>}
<因子>::=<标识符>|<无符号整数>| ‘(’<表达式> ‘)’
条件语句:<条件语句>:=IF<条件>THEN<语句>
赋值语句:<赋值语句>::=<标识符>:=<表达式>
复合语句:<复合语句>::=BEGIN<语句>{;<语句>}END
函数:
程序:<程序>::=<分程序>.
<分程序>::=[<常量说明部分>][<变量说明部分>][<过程说明部分>]<语句>
<常量说明部分>::=CONST<常量定义>{,<常量定义>};
<常量定义>::=<标识符>=<无符号整数>
<无符号整数>::=<数字>{<数字>}
<变量说明部分>::=V AR<标识符>{,<标识符>};
(3)其他PL/0语言文法的EBNF表示:
<过程说明部分>::=<过程首部><分程序>{;<过程说明部分>};
<过程首部>::=PROCEDURE<标识符>;
<语句>::=<赋值语句>|<条件语句>|<当型循环语句>|<过程调用语句>|<读语句>|<写语句>|<复合语句>|<空>
<条件>::=<表达式><关系运算符><表达式>|ODD<表达式>
<加法运算符>::=+|-
<乘法运算符>::=*|/
<关系运算法>:===|#|<|<=|>|>=
<过程调用语句>::=CALL<标识符>
<当型循环语句>::=WHILE<条件>DO<语句>
<读语句>::=READ‘(’<标识符>{,<标识符>} ‘)’
<写语句>::=WRITE‘(’<表达式>{,<表达式>} ‘)’
<字母>::=a|b|……|X|Y|Z