第四次作业
1. 梳理第二章的内容,写一篇理解与总结。
(1)文法是对语言结构定义与描述,即从形式上描述和规定语言结构,也称语法
(2)语法规则通过一组规则(产生式),来描述句子的语法结构
(3)处理文法的语法分析器大体上可以分为三种类型:通用的,自顶向下的和自顶向上的。
(4)文法:一种用于描述程序设计语言语法的表示方法——“上下文无关文法”,简称“文法”。
(5).一个上下文无关文法(文法)有四个元素组成:
文法G可以抽象成四元组的形式:G=(VN,VT,P,S)
其中VN表示非终结符集,VT表示终结符集,P表示产生式集,S表示开始符号。
① 一个终结符号集合,也称为词法单元。是组成串的基本符号。
② 一个非终结符号集合,也称为语法变量。是表示串的集合的语法变量。
③ 一个开始符号。这个符号表示的串集合就是这个方法生成的语言。
④ 一个产生式集合。描述了将终结符号和非终结符号组合成串的方法。有三个元素组 成:
1) 一个被称为产生式头或左部的非终结符号这个产生式定义了这个头所代表的串集合的一部分。
2) 符号→。
3) 一个由零个或多个终结符号或非终结符号组成的右部或产生式体。右部中的成分描述了左部的非终结符号所对应的串的某种构造方法。
(6)文法G描述的语言用L(G)表示L(G)={w|w∈VT*且S=*>w}
其中S是文法G的开始符号,我们可以说w是G的一个句型。因此一个终结符号串w在G生成的语言L(G)中,当且仅当w是G的一个句子。可以由文法生成的语言被称为上下文无关语言。
句型:一个句型可能既包含终结符号又包含非终结符号,也可能是空串。
句子:是一个不包含非终结符号的句型。
语言:一个文法生成的语言是它所有句子的集合。
文法等价:如果两个文法生成相同语言,这两个文法就被称为是等价的。
(7)
最左推导:总是选择每个句型的最左非终结符号。逆过程为最右规约。
最右推导:总是选择每个句型的最右非终结符号,也称为规范推导。逆过程为最左规约。
例:
文法:
S--->AB
A--->a|t
B---->+CD
C--->a
D---->a
最右推导:
S--->AB---->A+CD--->A+Ca---->A+aa----->a+aa
最左推导:
S---->AB----->aB--->a+CD--->a+aD----->a+aa
(8)上下文无关文法及其语法树:
(9).文法的二义性:如果一个文法可以为某个句子生成多棵语法分析树,那么它就是二义性的。换句话说,二义性文法就是对同一个句子有多个最左推导或多个最右推导的文法。
造成二义性的原因是:文法中没有体现出结合率和优先级。
文法的二义性和语言的二义性:
若一个文法存在某个句子对应两棵不同的语法树,则称这个文法是二义的
或者,若一个文法存在某个句子有两个不同的最左(右)推导,则称这个文法是二义的
判定任给的一个上下文无关文法是否二义,或它是否产生一个先天二义的上下文无关语言,这两个问题是递归不可解的,但可以为无二义性寻找一组充分条件
文法的二义性和语言的二义性是不同的概念。因为可能有两个不同的文法G和G’满足L(G)=L(G’),其中G是二义的,G’是无二义的。
如果产生上下文无关语言的每一个文法都是二义的,则说此语言是先天二义的。
2. 尝试写出PL/0 语言的文法。(或者你认为比较好的语言规则)
整数n <整数n>::=int <标识符n>=<无符号整数>|<有符号整数>;
标识符i <标识符i>::=<无类型> | <字符> | <整型> | <浮点型>;
表达式e <表达式> ::= [+ | -] <项> { <加法运算符><项>}
<语句>::= | <复合语句> | <表达式语句> | <选择语句> | <循环语句> |<跳转语句>
<表达式语句> →::=<表达式;>
<选择语句> ::=< IF(表达式)语句> | < IF(表达式)语句 > < ELSE 语句>
<循环语句> ::=< WHILE(表达式)语句> | < FOR(表达式语句表达式语句)语句> | < FOR(表达式语句表达式语句表达式)语句>
<跳转语句>::= | <continue;> |<breack;> | <return;> | <return 表达式; >
条件语句::=<逻辑‘或’表达式> | <逻辑‘或’表达式?> <表达式:> <条件表达式>
赋值语句 ::=<标识符>=<无符号整数>|<有符号整数>;
<复合语句> ::= BEGIN <语句> {;<语句>} END
函数::= <数据类型> <标识符>(形式参数...){句子;...}
<程序> ::= <分程序>