编译原理期末复习考点总结(一) 通俗易懂的方式解释概念(纯手打)

编译原理总结

基础概念

  1. 编译程序是什么?
    能把源语言程序转换成目标语言程序的程序。

  2. 编译过程
    词法分析:
    扫描源程序,将其分解为词法单元后输出。
    方法:正规式,有限自动机。

    语法分析:
    根据语法规则,对词法单元进行推导或规约,识别出各类语法单元,最终判断输入串语法是否正确。
    方法:上下文无关文法。

    语义分析与中间代码生成:
    使用语法树和符号表对语法单元进行语义分析并把他们翻译成一定形式的中间代码。
    方法:等价变换。

    优化:
    对中间代码进行优化处理。

    目标代码生成:
    把中间代码翻译成目标程序。


  3. 对源程序或中间结果从头到尾扫描一次,并做加工处理,生成新的中间结果或目标程序的过程。

  4. 前端
    与源语言有关而与目标机器无关的部分。

  5. 后端
    与源语言无关而与目标机器有关的部分。

  6. 文法
    描述语言的语法结构的形式规则

  7. 语法树
    用来描述句型推导的一棵树

  8. 上下文无关文法
    所定义的语法单位与上下文(环境)无关。

    包括:
    终结符:
    直观的是语法树的叶子结点、句子中的单词或字。
    例如:He,give,a,b……

     非终结符:
     	语法树的分支结点、句子中的语法成分。
     	例如:<冠词>,A,B……
    
     开始符号:
     	语法树的根结点、句子。
     	例如:<句子>,S……
    
     产生式:
     	由一种高级的语法成分推出低级的若干语法成分的式子。
     	例如:<间接宾语> -> <冠词><名词>,S—>A|B……
    
  9. 语法定义语言
    从文法规则的开始符号出发,反复使用产生式,对非终结符进行替换或展开,最终得到的就是一种语言。

    通俗来说,一般的句子结构可以是“主语+谓语+宾语”,然后我们用产生式来替换,主语->代词—>He,谓语->动词->plays,宾语->名词->piano。这样我们就推出一句话。

    如果这样一直重复,就可以把这种语法规则可以表示的所有语句推导出来,即一种语言。

  10. 最左推导
    如果我们对于9中提到的产生式,每次推导都是先替换最左边的非终结符,那就是一种最左推导。

  11. 最右推导
    如果我们对于9中提到的产生式,每次推导都是先替换最右边的非终结符,那就是一种最左推导。

  12. 二义文法
    因为我们对于9中提到的产生式,可以通过最左推导和最右推导分别推导出一样的句子,所以这种文法就是二义文法。

    在程序设计语言中,只有确定化的代码才可以被机器按部就班执行,否则,每次机器运行结果就一定会不同。所以,程序设计语言的文法不可以是二义文法。

  13. 思考:为什么9中提到的文法会有二义性?
    因为9中的文法未规定替换的优先级和结合方式。

  14. 形式语言
    0型文法(短语文法)递归可枚举

    1型文法(上下文有关文法)

    2型文法(上下文无关文法)对应非确定的下推自动机

    3型文法(正规文法)

末尾彩蛋

加入知识星球,有什么相关问题,有更多大佬及时解答
在这里插入图片描述

在这里插入图片描述

  • 27
    点赞
  • 104
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
第三章 L(G[S])={ abc } L(G[N])={ n位整数或空字符串 | n>0 } G[E]:E—>E+D | E-D | D D—>0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 L(G[Z])={ anbn | n>0 } (1) 考虑不包括“0”的情况 G[S]:S—>0S | ABC | 2 | 4| 6 | 8 A—>1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 B—>AB | 0B | ε C—>0 | 2 | 4 | 6 | 8 考虑包括“0”的情况: G[S]:S—>AB | C B—>AB | C A—>0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 C—>0 | 2 | 4 | 6 | 8 (2)方法1: G[S]:S—> ABC | 2 | 4 | 6 | 8 A—>1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 B—>AB | 0B | ε C—>0 | 2 | 4 | 6 | 8 方法2: G[S]:S—>AB | C B—> AB | 0B | C | 0 A—> 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 C—>2 | 4 | 6 | 8 设为E,为T,为F,注:推导过程不能省略,以下均为最左推导(1) E => T => F => i (4) E => E+T => T+T => T*F+T => F*F+T => i*F+T => i*i+T => i*i+F => i*i+i (6) E => E+T => T+T => F+T => i+T => i+T*F => i+F*F => i+i*F => i+i*I 是有二义性的,因为句子abc有两棵语法树(或称有两个最左推导或有两个最右推导) 最左推导1:S => Ac => abc 最左推导2:S => aB => abc (1) (2) 该文法描述了变量a和运算符+、*组成的逆波兰表达式 10、(1) 该文法描述了各种成对圆括号的语法结构 (2) 是有二义性的,因为该文法的句子()()存在两种不同的最左推导: 最左推导1:S => S(S)S => (S)S => ()S => ()S(S)S => ()(S)S => ()()S => ()() 最左推导2:S => S(S)S => S(S)S(S)S => (S)S(S)S => ()S(S)S => ()(S)S => ()()S => ()() 11、(1) 因为从文法的开始符E出发可推导出E+T*F,推导过程如下: E => E+T => E+T*F ,所以E+T*F是句型。 从子树和短语之间的关系可知: E+T*F是句型E+T*F相对于E的短语; T*F是句型E+T*F相对于T的短语,也是简单短语和句柄。 13、(1) 最左推导:S => ABS => aBS => aSBBS => aBBS => abBS => abbS => abbAa => abbaa (2) S—>ABS | Aa |ε A—>a B—>SBB | b (3) 首先为了区别句子abbaa中的a和b,把它写成a1b1b2a2a3 该句子的短语有:a1b1b2a2a3,b1b2,a2a3,a1,a2,b1,b2,ε 直接短语有:a1,a2,b1,b2,ε 句柄:a1 14、(1) G[S]:S—>AB A—>aAb |ε B—>aBb |ε (2) G[S]:S—>1S0 | A A—>0A1 |ε (3) G[S]:S—>0S0 | aSa | a 16、(1) G[A]:A—>aA |ε (2)G[A]:A—> aA | aB B—> bB | b (3)G[A]:A—>aA | B B—> bB | C C—>cC |ε 17、习题6、习题7和习题7中的文法所描述的语言都是由变量i、+、-、*、/、(和)组成算术表达式,因此它们之间是等价的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值