1. 梳理第二章的内容,写一篇理解与总结。

(1)文法的直观概念

EBNF表示:

<句子>::=<主语><谓语>

<主语>::=<代词>|<名词>

<代词>::=我|你|他

<名词>::=a|b|c|...

<谓语>::=<动词><直接宾语>

<动词>::=是|...

<直接宾语>::=<代词>|<名词>

 符号的含义是,使用一条规则,代替其左端的某个符号,产生其右端的符号串。

(2)符号和符号串

符号串:由字母表中的符号组成的任何有穷序列。

空符号串:ε,|ε|=0

(3)文法和语言的形式定义

1.处理文法的语法分析器大体上可以分为三种类型:通用的,自顶向下的和自顶向上的。

2.文法:一种用于描述程序设计语言语法的表示方法——“上下文无关文法”,简称“文法”。

3.一个上下文无关文法(文法)有四个元素组成:

文法G可以抽象成四元组的形式:G=(VN,VT,P,S)

其中VN表示非终结符集,VT表示终结符集,P表示产生式集,S表示开始符号。

(1)一个终结符号集合,也称为词法单元。是组成串的基本符号。

(2)一个非终结符号集合,也称为语法变量。是表示串的集合的语法变量。

(3)一个开始符号。这个符号表示的串集合就是这个方法生成的语言。

(4)一个产生式集合。描述了将终结符号和非终结符号组合成串的方法。有三个元素组成:

 ①一个被称为产生式头或左部的非终结符号这个产生式定义了这个头所代表的串集合的一部分。

 ②符号→。

 ③一个由零个或多个终结符号或非终结符号组成的右部或产生式体。右部中的成分描述了左部的非终结符号所对应的串的某种构造方法。

4.文法G描述的语言用L(G)表示L(G)={w|w∈VT*且S=*>w}

    其中S是文法G的开始符号,我们可以说w是G的一个句型。因此一个终结符号串w在G生成的语言L(G)中,当且仅当w是G的一个句子。可以由文法生成的语言被称为上下文无关语言。

(1)句型:一个句型可能既包含终结符号又包含非终结符号,也可能是空串。

(2)句子:是一个不包含非终结符号的句型。

(3)语言:一个文法生成的语言是它所有句子的集合。

(5)文法等价:如果两个文法生成相同语言,这两个文法就被称为是等价的。

5.(1)最左推导:总是选择每个句型的最左非终结符号。逆过程为最右规约。

   (2)最右推导:总是选择每个句型的最右非终结符号,也称为规范推导。逆过程为最左规约。
(4)文法的类型

1)0型文法:无限制文法、短语文法,α->β,α中至少含一个非终结符。

2)1型文法(CSG):上下文有关文法,α->β满足|α|<=|β|,对于产生式α1Aα2->α1βα2,用β替换A时,只能在上下文为α1和α2时才能进行。这里的|β|表示的是β的长度。同理|α|表示的是α的长度。

注意:虽然要求|β|>=|α|,但有一特例:α→ε也满足1型文法。

3)2型文法(CFG):上下文无关文法,A->β,其中左边必须有且仅有一个非终结符,当用β替换A时,与A的上下文环境无关。

如Ab->Bab虽然符合1型文法要求,但不符合2型文法要求,因为其α=Ab,而Ab不是一个非终结符。

4)3型文法(RG):也称为正则文法。

(5)上下文无关文法及其语法树

文法的二义性:如果一个文法可以为某个句子生成多棵语法分析树,那么它就是二义性的。换句话说,二义性文法就是对同一个句子有多个最左推导或多个最右推导的文法。

2. 尝试写出PL/0 语言的文法。(或者你认为比较好的语言规则)

(6)句型分析

自上而下的分析方法:

从开始符出发,试图推导给定的字符串,

自下而上的分析方法:

推导的逆过程,从符号串开始试图将其规约为开始符。

最左推导:

每次推导都施加在句型最左边的语法变量上

最右推导:

每次推导都施加在句型最右边的语法变量上

最右推导称为规范推导,右句型称为规范句型

2. 尝试写出PL/0 语言的文法。(或者你认为比较好的语言规则)

整数n→ 0|1|2…7|8|9|...|n

标识符i→ <字母>{<字母>|<数字>}

表达式e → [+|-]<项>{<加减运算符><项>}

条件语句→ if<条件>then<语句>

赋值语句→ <标识符>:=<表达式>

复合语句→ begin<语句>{;<语句>}end

程序→〈分程序〉

〈分程序〉→ [<常量说明部分>][<变量说明部分>][<过程说明部分>]〈语句〉