作业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<标识符>;

posted @ 2019-09-26 15:34  seele233  阅读(353)  评论(0)    收藏  举报