作业4 文法和语言总结与梳理
1.梳理第二章内容,写一篇理解与总结。
一、文法和语言的形式与定义。
(1)什么是文法?文法是对语言结构的定义与描述,即从形式上描述和规定语言结构,也称为语法。任何一个文法都可以表示为一个四元组G=(VN,VT,P,S)。
VN是一个非空的有限集合,它的每个元素称为非终结符号。
VT是一个非空的有限集合,的每个元素称为终结符号。
P是一个非空的有限集合,它的每个元素称为产生式。
S是一个特殊的非终结符号,称为文法的开始符号。
(2)什么是语言?在某一确定字母表上的特定符号串的集合。
(3)语法规则。通过产生一组规则(产生式),来描述句子的语法结构。
(4)由产生式推导句子。推导方法:从一个要识别的符号开始推导,即用相应产生式的右部来代替产生式的左部,每次仅用一条产生式进行推导。
(5)句型。由起始符推导出来的符号串。
(6)句子。仅含有终结符合的句型。
(7)语言。句子的集合。
二、符号和符号串
(1)字母表. 符号的非空有限集合。典型的符号是字母、数字、各种标点和运算符等。
(2)符号串.定义在某一字母表上,由该字母表中的符号组成的有限符号序列。
(3)符号串有关的几个概念。
①长度。符号串a的长度是指a中出现的符号的个数,记作|α|。
②空串。长度为0的符号串,常用ε表示。|α|=0
③前缀(头)。符号串α的前缀是指从符号串α的末尾删除0个或多个符号后得到的符号串。如:univ 是 university 的前缀。
④后缀(尾)。符号串α的后缀是指从符号串α的开头删除0个或多个符号后得到的符号串。如:sity 是 university 的后缀。
⑤子串。符号串α的子串是指删除了α的前缀和/或后缀后得到的符号串。如:ver 是 university 的子串。
⑥真前缀、真后缀、真子串 。如果非空符号串β是α的前缀、后缀或子串,并且β不等于α,则称b是α的真前缀、真后缀、或真子串。
⑦子序列。符号串α的子序列是指从α中删除0个或多个符号(这些符号可以是不连续的)后得到的符号串。如:nvst。
(4)符号串运算。
①连接。符号串α和符号串β的连接αβ是把符号串β加在符号串α之后得到的符号串,若α=ab,β=cd,则αβ=abcd,βα=cdba。对任何符号串α来说,都有εα=αε=α。
②幂。若α是符号串,α的n次幂是αn 。当n=0时,α0是空串。e假如α=ab,则有:α0=ε、α1=ab、α2=abab、α3=...
三、文法类型和语法树。
(1)文法分类。
①0型文法/无限制文法:α->β,其中α∈(Vn∪Vt)*且至少含有一个非终结符,β∈(Vn∪Vt)*。
②1型文法/上下文有关文法:αAβ->αuβ,其中A∈Vn,α,β∈(Vn∪Vt)*,u∈(Vn∪Vt)+。
③2型文法/上下文无关文法:A->β,其中A∈Vn,β∈(Vn∪Vt)*。常用于句法分析。
④3型文法/正规文法:常用于词法分析。
右线性文法:只能对推出式的右边展开,A->αB|α,A,B∈Vn,α∈Vt*。
左线性文法:只能对推出式的左边展开,A->Bα|α,A,B∈Vn,α∈Vt*。
(2)语法树。
①短语。是句型中的某个非终结符所能推出的符号串。
②直接短语。不能再推导出其他式子的符号串
③句柄。最左的直接短语。
④最左推导。每个推导过程都是从最左边的非终结符号的替换开始。
⑤最右推导。每个推导过程都是从最右边的非终结符号的替换开始。
(3)文法的二义性。如果一个文法的某个句子有不止一棵分析树,则这个句子是二义性的句子。含有二义性句子的文法是二义性的文法。
2. 尝试写出PL/0 语言的文法。
整数n
n :: = [-]{<非零数字>}<数字>
<非零数字>:: = 1|2|...|8|9
<数字>:: = 0|1|2|...|8|9
标识符i
i::=<字母> | {<字母> | <数字>}
<字母>::=a|b|c|...|X|Y|Z
<数字>::=0|1|2|...|8|9
表达式e
e ::= [+|-]<项>{<加减运算符><项>}
<项> ::= <因子>{<乘除运算符><因子>}
<加减运符> ::= +|-
<因子>::= <标识符>|<无符号整数>|’(‘<表达式>’)’
<乘除运算符>::= *|/
<标识符>::= <字母>{<字母>|<数字>}
<无符号整数>::={<数字>}<数字>
<数字>:: = 0|1|2|...|8|9
<字母>:: = a|b|c|...|X|Y|Z
条件语句
<条件语句> → if<条件>then<语句>
<条件> → <表达式><关系运算符><表达式>|odd<表达式>
<表达式>::= [+|-]<项>{<加减运算符><项>}
<项> ::= <因子>{<乘除运算符><因子>}
<加减运符> ::= +|-
<因子>::= <标识符>|<无符号整数>|’(‘<表达式>’)’
<乘除运算符>::= *|/
<标识符>::= <字母>{<字母>|<数字>}
<字母>:: = a|b|c|...|X|Y|Z
<无符号整数>::={<数字>}<数字>
<数字>:: = 0|1|2|...|8|9
<关系运算符>::==|#|<|<=|>|>=
<语句>::=<赋值语句>|<条件语句>|<当型循环语句>|<过程调用语句>|<读语句>| <写语句>|<复合语句>|<空语句>
<赋值语句>::=<标识符>:=<表达式>
<当型循环语句>::=while<条件>do<语句>
<过程调用语句>::=call<标识符>
<读语句>::= read’(‘<标识符>{,<标识符>}’)’
<写语句>::=write’(‘<表达式>{,<表达式>}’)’
<复合语句>::=begin<语句>{;<语句>}end
<空语句>::=ε
赋值语句、复合语句如上所述。
函数
<函数> ::= <类型说明><函数名><复合语句>
程序
<程序>::=<分程序>
<分程序>::=[<常量说明部分>][<变量说明部分>][<过程说明部分>]<语句>
<常量说明部分>::=const<常量定义>{ ,<常量定义>};
<常量定义>::=<标识符>=<无符号整数>
<变量说明部分>::=var<标识符>{ ,<标识符>};
<过程说明部分::=<过程首部><分程序>;{<过程说明部分>}
<过程首部>::=procedure<标识符>;
浙公网安备 33010602011771号