编译原理:文法和语言总结与梳理

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



一、 对程序设计语言的描述从语法、语义和语用三个因素考虑:

  • 语法:对语言结构的定义;
  • 语义:语言的含义;
  • 语用:从使用的角度描述语言。

形式语言理论是编译的理论基础。

二、 字母表:元素的非空有穷集合;

  • 符号/字符:字母表中的元素;
  • 符号串:符号的有穷序列。

三、 符号串运算:

  • 符号串的连接:εx=xε=x;
  • 集合的乘积:AB={xy|x∈A,y∈B};{ε}A=A{ε}=A;
  • 符号串的幂运算:x=abc,x^2=abcabc;
  • 集合的幂运算
  • 正闭包A+与闭包A*:A*={ε}∪A+

四、 形式语言:字母表上按照某种规则构成的所有符号串的集合,其不考虑语义。描述形式语言的方式有两种:

  • 枚举——当语言为有穷集合时;
  • 文法——描述了无穷集合的语言。

五、 文法:G=(Vn,Vt,P,S)

  • 规则P:也称为产生式,是一个符号与一个符号串的有序对(A,β)

  A→β
  i. 一组规则定义了一个语言的语法结构;
  ii. 规则中出现的符号分为终结符号和非终结符号

  • b) Vn为非终结符(non-terminate);
  • c) Vt为终结符(terminate);
  • d) S为非终结符号,称为文法的开始符号/识别符号,至少要在一条规则的左部出现。

六、 推导:推导的依据是规则

  • a) 直接推导:仅使用一次规则;
  • b) 推导:至少使用一次规则;
  • c) 广义推导:经过0步或若干步的推导。
  • d) 最右推导又称规范推导,推导出的句型为规范举行;与之对应的最左规约为规范规约。

七、 句型、句子和语言:

  • 句型:S=*>x, x∈(Vn∪Vt)*,其中S=*>x为广义推导。
  • 句子:S=*>x, x∈Vt*,其中S=*>x为广义推导,x必须是终结符的闭包(可为ε)。
  • 语言:L(G[S])={x|S=+>x且x属于Vt*},其中S=+>x为推导,至少使用一次规则。

八、 递归:

  • 递归规则:在规则的左部和右部具有相同非终结符的规则;

  i. 规则左递归:A->A…;
  ii. 规则右递归:A->…A;
  iii. 规则递归:A->…A…;

  • 文法递归:对文法中的任一非终结符,若能建立一个推导过程使得右部再次出现该非终结符,则文法是递归的。如:U->Vx, V->Uy|z,虽然这两个规则都不是递归规则,但组成的文法是递归文法U->Vx->Uyx。所以含有递归规则的文法一定是递归文法,而递归文法不一定含有递归规则。

九、 短语、直接短语和句柄:都是针对某一句型的

  • 短语:S=*>αAδ且A=+>β,则称β是相对于非终结符A的句型αAδ的短语;对应语法树中的子树概念。
  • 直接短语:其中A=>β为直接推导;对应语法树中的简单子树。每个直接短语都是某规则的右部。
  • 句柄:是直接短语(即某规则的右部),且具有最左性;对应简单子树中最左的一棵。

十、 文法的二义性:

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

  • 不改变文法中原有的语法规则,进增加一些语法的非形式定义,如优先级;
  • 构造一个等价的无二义性文法。

十一、 文法的分类:

  • 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 语言的文法。(或者你认为比较好的语言规则)



PL/0语言文法的BNF表示:

〈程序〉→〈分程序〉.

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

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

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

<无符号整数> → <数字>{<数字>}

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

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

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

<过程首部> → procedure<标识符>;

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

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

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

<条件> → <表达式><关系运算符><表达式>|odd<表达式>

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

<项> → <因子>{<乘除运算符><因子>}

<因子> → <标识符>|<无符号整数>|(<表达式>)

<加减运符> → +|-

<乘除运算符> → *|/

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

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

<过程调用语句> → call<标识符>

<当型循环语句> → while<条件>do<语句>

<读语句> → read(<标识符>{,<标识符>})

<写语句> → write(<表达式>{,<表达式>})

<字母> → a|b|c…x|y|z

<数字> → 0|1|2…7|8|9

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

原文地址:https://www.cnblogs.com/zhif97/p/11583562.html

时间: 2024-08-23 15:36:54

编译原理:文法和语言总结与梳理的相关文章

&lt;编译原理 - 函数绘图语言解释器(1)词法分析器 - python&gt;

<编译原理 - 函数绘图语言解释器(1)词法分析器 - python> 背景 编译原理上机实现一个对函数绘图语言的解释器 - 用除C外的不同种语言实现 解释器分为三个实现块: 词法分析器:用于识别一条语句中的关键词是否符合预先定义的规则. 语法分析器:用来确定一条语句是否满足语法规则. 解释器:用来确定满足语法规则的句子,在意思上是否符合要求. 设计思路: 设计记号:词法分析器读取一个序列并根据构词规则把序列转化为记号流 定义一个字典:把所有符合一个模式的保留字.常量名.参数名.函数名等放进字

&lt;编译原理 - 函数绘图语言解释器(3)解释器 - python&gt;

<编译原理 - 函数绘图语言解释器(3)解释器 - python> 背景 编译原理上机实现一个对函数绘图语言的解释器 - 用除C外的不同种语言实现 设计思路: 将语法分析器并入绘图功能 继承语法分析器覆盖重写 用Pycharm写了一个.py文件: parserclass.py 输入流是语法分析器得到的语法树,输出流是绘制的图像 测试文本序列: //----------------测试程序1:分别测试------------------------ ORIGIN IS (100,300); //

编译原理之文法和语言总结与梳理

前言 一个程序设计语言是一个记号系统,如同自然语言一样,它的完整定义应包括语法和语义两个方面.所谓一个语言的语法是指一组规则,用它可以形成和产生一个合适的程序.目前广泛使用的手段是上下文无关文法,即用上下文无关文法作为程序设计语言语法的描述工具.语法只是定义什么样的符号序列是合法的,与这此符导的含义落无关系,比如对于个Pascal程序来说,一个上下文无关文法可以定义符号串A:一B+C是一个合乎语法的默值语句,而A:=B+就不是.但是,如果B是实型的,而C是布尔理的,或者B.C中任何一个变量没有事

编译原理:C语言词法分析器

编译原理的实验:完成对C语言的词法分析 先说一下整体框架: 基类:Base  封装了一些基础的字符判断函数,如下: int charkind(char c);//判断字符类型 int spaces(char c); //当前空格是否可以消除 int characters(char c);//是否是字母 int keyword(char str[]);//是否是关键字 int signwords(char str[]);//是否是标识符 int numbers(char c);//是否是数字 in

4.文法和语言总结与梳理

1.梳理第二章的内容,写一篇理解与总结. 第二章首先介绍了文法的相关概念以及概念的推导过程,接着介绍了符号和符号串,其中字母表的定义为元素非空有穷集合,字符串为由字母表中的符号组成的任何有穷序列.接着介绍字符串的一些运算,例如:符号串的头尾,固有头和固有尾:符号串的连接:符号串的方幂:符号串集合.文法和语言的形式定义:文法G定义为四元组(VN,VT,P,S),其中VN为非终结符,VT为终结符,P为规则(a→ß)的集合.S为识别符或开始符,不是终结符,至少有一条出现在左边. 文法的类型有四种:0型

文法和语言总结与梳理

1. 梳理第二章的内容,写一篇理解与总结. 第二章主要讲述了文法的直观概念,符号和符号串,文法和语言的形式定义,文法的类型,上下文无关语法及其语法树 句型的分析,自订向下的分析方法,自底向上的分析方法,限制文法中不得含有有害规则和多余规则,在形式语言中, 最右推导常被称为规范推导,由规范推导所得的句型称为右句型或规范句型,而且一个文法存在某个句子对应两颗 不同的语法树,则这个文法是二义的. 2. 尝试写出PL/0 语言的文法.(或者你认为比较好的语言规则) 整数n 标识符i 表达式e 条件语句

编译原理学习(5)文法和语言总结与梳理

梳理第二章的内容,写一篇理解与总结. 文法: 以有穷的集合刻画无穷的集合的一个工具.用规则来说明句子的组成结构,用来表示无穷句子的语言描述. 句子与句型: 如果符号串x是由起始符号推导出的,则称x是文法G[S]的句型. 如果x中只包含终结符,则称x是文法G[S]的句子. 文法描述的语言是该文法一切句子的集合. 四种文法: 0型文法:α→β,其中α至少包含一个非终结符. 1型文法(上下文有关文法):α→β,其中|β|≥|α|,S→ε除外. 2型文法(上下文无关文法):a→β,其中a是一个非终结符.

计算机编译原理---文法

乔姆斯基把方法分成四种类型,即0型.1型.2型和3型.这几种文法类型的概念一定要掌握,是一个非常重要的考点.对于这几种文法,一般书上都只有简单的 概念介绍,比较抽象,所以很多学员都没有真正理解.下面我将把概念结合例题进行讲解. 0型文法 设G=(VN,VT,P,S),如果它的每个产生式α→β是这样一种结构:α∈(VN∪VT)*且至少含有一个非终结符,而β∈(VN∪VT)*,则G是一个0型文法.0型文 法也称短语文法.一个非常重要的理论结果是:0型文法的能力相当于图灵机(Turing).或者说,任

编译原理:tiny语言

描述真实的编译器非常困难."真正的"编译器--也就是希望在每天编程中用到的--内容太复杂而且不易在本教材中掌握.另一方面,一种很小的语言(其列表包括1 0页左右的文本)的编译也不可能准确地描述出"真正的"编译器所需的所有特征. 为了解决上述问题,人们在(A N S I)C中为小型语言提供了完整的源代码,一旦能明白这种技术,就能够很容易地理解这种小型语言的编译器了.这种语言称作T I N Y,在每一章的示例中都会用到它,它的编译代码也很快会被提到.完整的编译代码汇集在