编译原理知识

1、将表达式翻译成后缀式

https://zhidao.baidu.com/question/421915764.html

2、绪论

  指令格式:操作码  操作地址码

  低级语言:机器语言、汇编语言

  翻译:逻辑等价的程序语言转变、编译:专指高级语言一次性转化为低级语言、解释:高级语言的一解释一执行

  编译程序工作过程一般可分为五个阶段:词法分析、语法分析、语义分析、优化和目标代码生成,同时伴随表格管理和出错处理

  编译有自编译和交叉编译

3、词法分析

  任务:从左到右逐个字符地对源程序进行扫描,产生一个个单词 (Token)符号,输入源程序,输出单词符号(流),需要不断访问、更新符号表

  符号分类:保留字、标识符、常数、运算符、界符

扫描二维码关注公众号,回复: 8455026 查看本文章

  输出为二元式:(单词种别,单词自身的值/内码值)

  状态转换图

    作用:识别单词

    定义:状态转换图是状态有限的有向图,结点代表状态,用圆圈表示;结 点之间可由有向边连接,代表状态转换关系,有向边上可标 记字符,表示前一状态接受某一个字符之后的状态转移

    状态转换图的表示:

      • 初始状态用“ ->○”表示 • 非终止状态用“○”表示 • 状态之间的跳转用“ ”(有向边)表示 • 终止状态用“◎*”表示

      含分支的状态 • 对应一个switch()语句 • 或对应一组if-else语句

      含回路的状态 • 对应一个while语句

        

  正规表达式与正规集

    状态转换图可以构造词法分析程序,但属于非形式化描述

    正规表达式(简称正规式)是词法分析的形式化表示方法

    所谓形式化的方法,是指用一整套带有严格规定的符号体系 来描述问题的方法,优点:更加清晰和准确

     形式化表示标识符,即标识符的正规式:letter(letter | digit)* (能够表示的单词集合称为正规集),这里,字母字符用letter表示,数字字符用digit表示

     letter(letter | digit)*的并置表示连接 • 括号中的“ | ”表示letterdigit两者选一 • “*”表示零次或多次引用,长度为0,1,2,„„

    相关基础概念

      1.字母表:语言元素的非空有穷集合,通常用‘Σ’表示

        注意:字母表中至少包含一个元素,任何语言的字母表 规定了该语言中允许出现的一切符号。

      2.符号:字母表中的每一个元素,也叫字符

      3.符号串:由符号组成的有穷序列(可以是0个),也叫

      4.空字:长度为0的字,用‘ε’表示

      5.字的全体:所有字组成的集合,用“ Σ * ”表示

      6.空语言:不含任何字的语言{ },用‘Ф’表示

      注意区分ε、{ }和{ε}: ε是空字,是语言字的集合中的一个元素,不是Σ的元素;{ }不包含任何字,属于集合的概念 ;{ε}由空字组成的集合,这个集合比{ }多一个元素

    正规式的运算

      连接运算:ab·aab = abaab;A={ab,bc} ,B={ac,cb },则: AB ={abac,abcb,bcac,bccb}(AB≠BA)

      正规式的幂运算:正规式自身的n次连接Rn = RR…R,并约定: R^0 = {ε}

      集合R的闭包表示为R* ,具体定义为: R* = R0∪R1∪R2∪R3∪… • 集合R的正闭包表示为R+ ,具体定义为: R+ = R1∪R2∪R3∪… = RR*

  正规表达式和有限自动机

    • FA是一个状态转换图,“有限”指的是状态有限。当前状 态读入一个字符后,和后继状态的转换有以下三种情形:

      (1)后继状态为自身

      (2)后继状态只有一个

      (3)后继状态有多个

      • 如果每次转换的后继状态是唯一的,则称它为确定有限自动机(Deterministic FA)

      • 如果每次转换的后继状态不是唯一的,则称它为非确定有限自动机(Nondeterministic FA)

      

       • NFA相比于DFA的特征: (1) 可以有若干个初始状态 (2) f多值映射 (3) 允许接收字和空字符ε

      – FA 所能识别的字符串集为FA 所识别的语言,记为L(M)

      – 对于任意两个FA M和 FA M’, 如果L(M)=L(M’), 则称M和 M’等价

      – 对于任意一个NFA M,一定存在一个DFA M’与其等价

    有限自动机的构造

      从正规式开始构造DFA的过程有以下几个步骤:

        – 1.由正规式构造NFA;

        – 2.由NFA构造与之等价的DFA(确定化)

        – 3.DFA的化简

      

    状态集合I的ε_闭包 • 设I是FA:M的状态子集,则以下状态属于ε_CLOSURE(I)

      (1) 若si∈I,则si∈ ε_CLOSURE(I) ; (2) 若si∈I,则对从si出发经过任意条ε通路所能到达的 状态sj,都有sj ∈ ε_CLOSURE(I)

    定义Ia = ε_CLOSURE(J) ,其中: I={s1 , s2 ,…, sn },J = f(I,a) = f(s1 ,a)∪f(s2 ,a)∪… ∪ f(sn ,a)

     

     

4、语法分析  

  任务
    根据语言的语法规则对单词序列进行语法分析,识别合法的语法单位(如表达式、语句、程序段等),若不存在语法错误则给出正确的语法结构(语法树)
  理论依据:上下文无关文法
  方法
    自顶向下分析(推导:开始符号到句子)
    自底向上分析(规约:句子到开始符号)

  文法(Grammar)是程序语言的生成系统,用文法可以精确定义一个语言,并依据该文法构造出识别这个语言的自动机

  文法对程序语言和编译程序的构造具有重要意义,如程序语言的词法可用正规文法描述,语法可用上下文无关文法描述,而语义则要借助于上下文有关文法描述

  文法和语言基础    

    文法 (定义)
      文法通常表示成四元组G[S] = (VT,VN,S,ξ):
      (1)  VT为终结符号集,这是一个非空有限集,它的每个元素称为终结符号。
      (2)  VN为非终结符号集,它也是一个非空限集,其每个元素称为非终结符号,且有VT∩VN = Φ;
      (3)  S为文法开始符,是一个特殊的非终结符号,即S∈VN;

      (4)   ξ /ksi/ 是产生式的非空有限集,其中每个产生式(或称规则)是一序偶(α,β),通常写作

                  α → β 或 α ::= β
读作“α产生β”、 “α是β”或“α定义为β”。在此,α为产生式的左部,而β为产生式的右部,α、β是由终结符和非终结符组成的符号串,α∈(VT∪VN) + 且至少有一个非终结符,而β∈(VT∪VN) *。

    关于文法表示的约定:
      在此后的讨论中,用大写字母A、B、S、E等表示非终结符,用小写字母a、b、i、j等表示终结符,并用希腊字母等表示文法符号串,即α、β、δ、γ等均属于(VT∪VN)*。

    句型:假定G[S]是一个文法,S是它的开始符号,如果S=>α,α∈(VT∪VN)*,则称α是文法G[S]的一个句型;
    句子:如果α∈ VT *,则称α是文法G[S]的一个句子。仅含终结符的句型是一个句子
    由定义可知,开始符S本身只能是文法的一个句型而不可能是一个句子
    句子是特殊的句型(不含有非终结符的句型)
    上面推导出的i+i*i是文法G[E]的一个句子(当然也是一个句型),而E+E、E+E*E、E+E*i和E+i*i都是文法G[E]的句型

  形式语言分类
    语言学家Noam Chomsky于1956年首先建立了形式语言的描述,定义了四类文法及相应的形式语言,它对程序语言的设计、编译方法、计算复杂性等方面都产生了重大影响:
    0型文法与0型语言(对应图灵机)
    1型文法与1型语言(对应线性界限自动机,自然语言)
    2型文法与2型语言(对应下推自动机,程序设计语言)
    3型文法与3型语言(对应有限自动机)

  0型文法与0型语言

    如果文法G[S]的每一个产生式具有下列形式:

                  α→β
    其中,α∈V*VNV* (注:V = VN∪VT),即α至少含有一个非终结符;β∈V*;则称文法G[S]为0型文法或短语文法

    图灵机(1936)
      存储带(可移动,可被读写)
      控制器(有限状态,运行指令)
      读写磁头
      程序是五元组序列(当前状态,当前符号,下一符号,动作,下一状态)

      邱奇-图灵论题:所有计算或算法都可以由一台图灵机来执行。

  1型文法与1型语言文法

    G[S]的每一个产生式α→β,均在0型文法的基础上增加了字符长度满足| α |≤| β |的限制,则称文法G[S]为1型文法或上下文有关文法

  2型文法与2型语言

    文法G[S]的每一个产生式具有下列形式:  A → α

      2型文法相应的语言称为2型语言或上下文无关语言,它的识别系统是下推自动机

   3型文法与3型语言

     文法G[S]的每个产生式具有下列形式:  A → a  或  A → aB

     3型文法相应的语言称为3型语言或正规语言,它的识别系统是有限自动机  

  4类文法的关系与区别
    关系:
      (1) 从0型文法到3型文法的限制逐渐增;
      (2) 1~3型文法都属于0型文法;
      (3) 2、3型文法不一定属于1型文法:因为1型文法不允许存在“A →ε”形式的产生式,则:如果2、3文法不含有类似产生式,则该文法属于1型文法。

    区别:
      (1) 1型文法中不允许有形如“A→ε”的产生式存在,而2、3型文法则允许形如“A→ε”的产生式存在;
      (2) 0、1型文法的产生式左部存在含有终结符号的符号串或两个以上的非终结符,而2型和3型文法的产生式左部只允许是单个的非终结符号。

   正规表达式和上下文无关文法

    正规表达式描述词法,适用于描述线性结构,如标识符、表达式等

    上下文无关文法适用于描述非线性嵌套结构,如if-else,while等

  推导与语法树

    每一步推导都是对句型中的最右非终结符用相应产生式的右部进行替换,这样的推导称为最右推导规范推导),规范推导的逆过程称为规范规约

     如果每一步推导都是对句型中的最左非终结符用相应产生式 的右部进行替换,则称为最左推导

    而且短语属于矩形的组成部分

     一个句型的最左直接短语称为该句型的句柄

    素短语
      • 含有终结符的短语,如果它不存在也具有同样性质的真子串(不能包含有另一个素短语),则该短语为素短语
      (1)是短语
      (2)至少包含一个终结符
      (3)不再包含其它素短语  

    在编译方法中,为了便于识别或分析句子而引入了语法树这一重 要的辅助工具

    语法树以图示化的形式把句子分解成各个组成部分来描述或分析 句子的语法结构,这种图示化的表示与所定义的文法规则完全一 致,但更为直观和完整

     1、语法树(定义)

      • 对文法G[S] = (VT , VN , S, ξ),满足下列条件的树称为G[S]的语法树

        (1) 每个结点用G[S] 的一个终结符或非终结符标记;

        (2) 根结点用文法开始符S标记;

        (3) 内部结点(指非树叶结点)一定是非终结符,如果某内部结 点A有n个分支,它的所有子结点从左至右依次标记为x1、 x2、…、xn,则A → x1x2…xn一定是文法G[S]的一条产生式;

        (4) 如果某结点标记为ε,则它必为叶结点且是其父结点的惟一子结点

       

     定义:文法G[S]的一个句子如果能找到两种不同的最左推导 (或最右推导),或者存在两棵不同的语法树,则称这个句子 是二义性的。一个文法如果包含二义性的句子,则这个文法 是二义文法,否则是无二义文法。

  自顶向下语法分析

      算法思想:  从文法的开始符号出发,向下推导,如果推导出的句子恰好 为输入符号串,则输入符号串为符合该文法的句子;  或者:开始符号作为根节点,向下生长出一棵语法树,其叶 子节点组成的句子恰好为输入符号串。这里的每一步“生长” 对应一次直接推导。

      自顶向下分析方法:  1、不确定的自顶向下分析  2、确定的自顶向下分析(重点) – 递归下降分析法 – LL(1)分析法

      不确定的自顶向下分析

        这种自顶向下的分析是一个不断试探的过程;即,在分析 过程中,如果出现多个产生式(即候选式)可供选择,则逐一试 探每一候选式进行匹配,每当一次试探失败,就选取下一候选 式再进行试探; 此时,必须回溯到这一次试探的初始现场,包括注销已生 长的子树将匹配指针调回到失败前的状态。 这种带回溯的自顶向下分析方法实际上是一种穷举的试探 方法,其分析效率极低,在实用的编译程序中很少使用。

       确定的自顶向下分析

        确定的自顶向下分析要求文法满足两个条件:

        (1) 文法不含左递归:即不存在这样的非终结符号A:有 A→A…存在或者有;原因:左递归的文法使自顶向下分析工作陷入无限循环

        (2) 无回溯,对文法的任一非终结符号,当其产生式右部 有多个候选式可供选择时,各候选式所推出的终结符号串 的首字符集合要两两不相交 原因:会导致先前做的一大堆语法工作语义工作(指 中间代码产生工作和各种表格的簿记工作)推倒重来

      消除直接左递归        

        方法:引入一个新的非终结符,把含有左递归的产生式改写为右递归。

        规则:将产生式 A → Aα | β 改写为: A → βA' ,A' → α A' | ε 其中, A'是新引入的非终结符。ε 不可缺少,否则推导过程无 法结束。

        

       消除回溯

        回溯发生的原因在于候选式存在公共的左因子,如产生式A如 下: A → αβ1 | αβ2 此时,如果输入串待分析的字符串前缀为α,则选用哪个候 选式以寻求与输入串匹配就难以确定。 – 倘若候选式不含公共左因子,则推导出的首字符能与输入串 匹配的那个候选式便是惟一的匹配。

        

   LL(1)分析法

     LL(1)分析法又称预测分析法,是一种不带回溯的非递归自顶 向下分析法

    LL(1)的含义是:第一个L表明自顶向下分析是从左至右扫描 输入串的;第二个L表明分析过程中将用最左推导;“1”表 明只需向右查看一个符号就可决定如何推导(即可知用哪个产 生式进行推导)

    LL(1)分析法的基本思想

      根据输入串的当前输入符号来惟一确定选用某条规则(产生式)进行推导;当这个输入符号与推导第一个终结符相同时,再取输入串的下一个符号,继续确定下一个推导应选的规则;如 此下去,直到推导出被分析的输入串为止。

      

    LL(1)分析表的构造

      为了构造分析表M,需要预先定义和构造两族与文法有关的集 合FIRSTFOLLOW   

      即, FIRST(α)是可从α推导得到的所有字的首字符集合(包 括ε )。

      

       

       

       

         

      

 

猜你喜欢

转载自www.cnblogs.com/LieYanAnYing/p/12163124.html