zoukankan      html  css  js  c++  java
  • 编译原理:文法和语言总结与梳理

    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

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

  • 相关阅读:
    python高阶函数——返回函数(闭包)
    python高阶函数——sorted排序算法
    python高阶函数—filter
    python高阶函数——map/reduce
    Python——高阶函数概念(Higher-order function)
    Python高级特性——迭代器
    Python高级特性——生成器(generator)
    Python高级特性——列表生成式(list Comprehensions)
    Python高级特性——迭代(Iteration)
    Python高级特性——切片(Slice)
  • 原文地址:https://www.cnblogs.com/zhif97/p/11583562.html
Copyright © 2011-2022 走看看