9.25文法和语言总结与梳理

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

 本章主要讲了文法和语言的基本定义,我们通过本章主要学习了文法的直观概念、符号和符号串、文法和语言的形式定义、文法的类型、上下文无关文法及其语法树、句型的分析等这几个内容。重点在于文法的形式定义、上下文无关文法、正规文法、推导、短语、分析树、二义性。

1、 字母表和符号串

字母表:Ⅰ.符号的非空有限集合,例如:aabbccⅡ.典型的符号是字母、数字、各种标点和运算符等。

符号串:Ⅰ.定义在某一字母表上 Ⅱ.由该字母表中的符号组成的有限符号序列 Ⅲ.同义词:句子、字。主要包括字符串的连接,集合运算,符号串的幂运算,集合的幂运算正闭包A+与闭包A*。

2、  文法

定义:文法是对语言结构的定义与描述。即从形式上用于描述和规定语言结构的称为"文法"(或称为"语法")

   任何一个语法都可以表示为四元组G=(VN,VT,P,S),其中VN为非终结符,VT 终结符的非空有穷集,VN∩VT=Φ,P为产生式(规则)集合,S称作识别符或开始符。

       

例如一个整数的产生的文法:

G(N):N->D|ND

D->0|1|2|3…|9

可以写成VT={0,1,2 …}  VN={N,D}  S=N   P={N->D,N->ND,D->0,D->1,…}

3、语言

形式定义:在某一确定字母表上的特定符号串的集合。

4、推导:包括最左推导和最右推导。

最左推导:如果a =>β,并且在每“一步推导”中,都替换α中最左边的非终结符号,则称这样的推导为最左推导。

最右推导:如果a =>β,并且在每“一步推导”中,都替换α中最右边的非终结符号,则称这样的推导为最右推导。也称作规范推导

例如:

5、短语、直接短语和句柄:

短语:对于文法G=(VT,VN,S, j),假定abd是文法G的一个句型,如果存在:S=*>αAδ且A=+>β,则称β是句型abd关于非终结符A的短语;对应语法树中的子树概念。

直接短语:如果存在:S=*>αAδ且A=>β,则称β是句型abd关于非终结符A的直接短语。对应语法树中的简单子树。每个直接短语都是某规则的右部。

句柄:一个句型的最左直接短语,对应简单子树中最左的一棵。

例如:

6、 二义性:文法二义性及语言二义性

定义:如果一个文法存在某个句子对应两棵不同的语法树或包含两个或两个以上的最右(最左)推导(规约),则该文法是二义性的,可以利用文法之间的等价性来消除二义性。

解决方法:①如果两个文法产生的语言相同,即L(G)=L(G’),则称这两个文法是等价的。

②有时,一个二义性的文法可以变换为一个等价的、无二义性的文法。

③有些语言,根本就不存在无二义性的文法,这样的语言称为二义性的语言。

二义性问题是不可判定的

不存在一种算法,它能够在有限的步骤内确切地判定出一个文法是否是二义性的。

可以找出一些充分条件(未必是必要条件),当文法满足这些条件时,就可以确信该文法是无二义性的。

7、 文法的分类

①0型文法/无限制文法:α->β,其中α∈(Vn∪Vt)*且至少含有一个非终结符,β∈(Vn∪Vt)*。

②1型文法/上下文有关文法:αAβ->αuβ,其中A∈Vn,α,β∈(Vn∪Vt)*,u∈(Vn∪Vt)+。

③2型文法/上下文无关文法:A->β,其中A∈Vn,β∈(Vn∪Vt)*。常用于句法分析。

④3型文法/正规文法:常用于词法分析

  i. 右线性文法:只能对推出式的右边展开,A->αB|α,A,B∈Vn,α∈Vt*。
  ii. 左线性文法:只能对推出式的左边展开,A->Bα|α,A,B∈Vn,α∈Vt*。

本章重点在于理解语法、语义、文法、语法树的产生、二义性的句子/文法/语言等,学会如何解决①给定文法,产生语言;②求短语、直接短语和句柄;③定义文法,描述语言。

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

整数n<整数> ::= [-] <数字> {<数字>}

<数字> ::= 0 | 1 | 2 | … | 8 | 9

标识符I <标识符i> ::= <字母> { <字母> | <数字> }

<字母> ::= a | b | … | X | Y | Z

<数字> ::= 0 | 1 | 2 | … | 8 | 9

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

      <加法运算符> ::= + | -

      <项> ::= <因子> { <乘法运算符> <因子> }

<因子> ::= <标识符> | <无符号整数> | ‘(’ <表达式> ‘)’

<乘法运算符> ::= * | /

<无符号整数> ::= <数字> { <数字> }

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

<字母> ::= a | b | … | X | Y | Z

<数字> ::= 0 | 1 | 2 | … | 8 | 9

条件语句:<条件语句> ::= if<条件>then<语句>

<条件> ::= <表达式> <关系运算符> <表达式> | ODD <表达式>

<语句> ::= <赋值语句> | <条件语句> | <当型循环语句> | <过程调用语句> | <读语句> | <写语句> | <复合语句> | <空语句>

<关系运算符> ::= = | # | < | <= | > | >=

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

<条件语句> ::= if<条件>then<语句>

<当型循环语句> ::= WHILE <条件> DO <语句>

<过程调用语句> ::= CALL <标识符>

<读语句>  ::= READ ‘(’ <标识符> {,<标识符>} ‘)’

<写语句>  ::= WRITE ‘(’ <表达式> {, <表达式>} ‘)’

<复合语句> ::= begin <语句> {;<语句>} end

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

<标识符id> ::= <字母> { <字母> | <数字> }

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

复合语句:<复合语句> ::= begin <语句> {;<语句>} end

      <语句> ::= <赋值语句> | <条件语句> | <当型循环语句> | <过程调用语句> | <读语句> | <写语句> | <复合语句> | <空语句>

函数:<函数> ::= <类型说明><函数名><复合语句>

      <复合语句> ::= begin <语句> {;<语句>} end

<语句> ::= <赋值语句> | <条件语句> | <当型循环语句> | <过程调用语句> | <读语句> | <写语句> | <复合语句> | <空语句>

程序:<程序> ::= <分程序>

<分程序> ::= [<常量说明部分>] [<变量说明部分>][<过程说明部分>] <语句>

<常量说明部分> ::= CONST <常量定义> { ,<常量定义> } ;

<常量定义> ::= <标识符> = <无符号整数>

<无符号整数> ::= <数字> {<数字>}

<变量说明部分> ::= VAR <标识符 > { , <标识符 > } ;

<标识符> ::= <字母> {<字母>|<数字>}

<过程说明部分> ::= <过程首部><分程序>{; <过程说明部分> };

<过程首部> ::= PROCEDURE <标识符> ;

原文地址:https://www.cnblogs.com/Azan1999/p/11593141.html