编译原理.

目录

概述

词法分析

语法分析


概述

  1.  什么是编译程序?编译程序的工作过程?
        编程程序是一种翻译程序,它能够把某一种“高级语言”转换为诸如汇编语言或机器语言的“低级语言”。
        编译程序的工作过程从输入源程序开始到输出源程序结束;涉及5个阶段:
        词法分析:输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个的单词(单词符号)
        语法分析:在词法分析的基础上,根据语言的语法规则,把单词符号串分解为各类语法单元。(语法范畴)
        语义分析与中间代码生成:对语法分析锁识别出的各类语法范畴,分析其含义,并进行初步翻译(产生中间代码)
        代码优化:对中间代码进行加工变换,以实现更高效的目标代码。
        目标代码生成:把中间代码(经过优化处理)转换成特定机器上的低级语言代码。
     
  2. 简述程序语言的语法、语义规则,它们有何作用?
        程序语言就是一个记号系统,主要由语法和语义两方面定义。即任何程序语言都是一定字符集上的一个字符串,合乎语法规则的字符串才是合法的程序。
        语法是用来形成一个合法程序的规则,包括词法规则和语法规则,语法规则使用文法进行描述的。而程序的实际意义则由语言的语义规则定义。
     
  3. 程序的函数调用的4种方式:
        传地址:将实参的地址传递给形参变量,函数间接改变实参的值。
        传值:将实参的值传递给形参变量,不可以改变实参的值。
        传名:把任一出现的形式参数都替换成相应的实在参数(文字替换),形参使用实参的地址和值,函数直接改变参数的值。
        得结果:每个形式参数对应有2个单元,第1个单元存放实参的地址,第2个单元存放实参的值。在过程中对形参的任何引用都是对它的第2个单元直接访问,当过程结束后,才将结果存放到对应的第一个单元中。
     
  4. 标识符和名字有什么区别?
         标识符是高级语言中的字符串,一般由字母、数字、下划线构成,它只是一个标志没有实际的含义。
         名字是用标识符表示的,但是名字有其含义,具有属性和值。
     
  5. 解释器和编译器有什么区别?
        编译器:将高级语言翻译成低级语言,然后由虚拟机(或硬件)执行编译的结果。
        解释器:它将高级语言的源程序翻译成一种中间语言程序,然后对中间语言程序进行解释执行,编译和解释集合在一个程序中,所以称为解释器。(在进入Java时代,解释器的两个功能是分离的,前一个程序称为编译器,它把Java语言的程序翻译为字节码;后一个程序称为解释器,它对字节码进行逐行解释执行。) 
        编译执行比解释执行效率更高,因为编译执行对源程序的词法分析、语法分析、语义分析只进行一次;解释执行中每次执行到程序的某个语句都要进行词法分析、语法分析、语义分析,反复循环降低了解释执行的效率,所以解释执行都要寻找一种适合于解释的中间语言,以减少反复分析的时间。如Java语言的解释执行的优点是,与机器和平台无关的中间语言程序能通过网络传到其他站点上运行,只要在那里由一个中间语言的解释器就可以了。
     
  6. 什么叫交叉编译?
        称运行编译程序的计算机为宿主机,运行编译程序产生的目标代码的计算机称为目标机。即在A机器上运行编译程序生成B机器需要的目标代码。



     

词法分析

  1. 词法分析器的主要任务是什么?如何让构造词法分析器?
        词法分析器扫描源程序的字符流,产生可以用于语法分析的词法记号序列。
        构造词法分析器最简单的方法就是使用状态转换图来描述源语言词法记号的结构,然后手工把这种状态转换图翻译为能够识别词法记号的程序。一张状态转换图只有有限个状态,其中一个初态,至少一个终态(用双圈表示)。
     
  2. 什么是正规式?什么是正规语言?正规表达式的运算有哪些?
        正规式是按照一组定义规则,由较简单的正规式构成的,每个正规式 r 都可以标识一个语言L(r)。由正规式表示的语言称为正规语言。如:a|b、a*、aε都是正则式,L(r)、L(s)都是语言。
        闭包运算( * ):最高优先级,左结合
        连接运算(两个正规式并列):优先级次之,左结合
        选择运算( | ):优先级最低,左结合
     
  3. 有限自动机是什么?
         语言的识别器是一个程序,它取串s作为输入,当s为语言的句子时,它回答“是”,否则回答“不是”,可以通过构造有限自动机一种更一般的转换图,把正规式翻译成识别器。
          有限自动机分为确定和不确定的,确定的表示对于某个输入符号对应着唯一的状态转换,不确定的表示对于某个输入符号存在着不止一种转换。它们都能识别正规集 ,但是确定的有限自动机状态会更多,结构更复杂,但识别速度会更快。
        有限状态机NFA M是一个五元式 M =(S,Σ,δ,S0,F)分别表示状态有限集、输入符号的集合(代表空串的ε不能出现在Σ中。)
     
  4. 正则式、NFA、DFA的等价性:
        正则式和有限自动机的等价性:对于任何FA M,都存在这个一个正则式r,使得L(r) = L(M);同样对于任何正规式r,都存在一个FA M,使得L(M) = L(r)。
        确定的有限自动机和不确定的有限状态机是等价的,所以三者互相等价。
     
  5. 确定的有限自动机和不确定的有限自动机的区别?

     
  6. 从正规式到有限状态机的转化:
    正规式→NFA→DFA→DFA简化
     
  7. 从NFA到DFA的转换方法:
        子集构造法的思想:在NFA的转换表里,每个条目是一个状态集合;在DFA的转化表中,每个条目只有一个状态。从NFA构造等价DFA的一般思想就是让重新构造的DFA的每个状态对应到该NFA的一个状态集,即这个DAF在读取输入a1a2...an后到达的状态,对应于该NFA从开始状态沿着那些标有a1a2...an的路径能到达的所有状态的集合。

  8. 保留字、关键字和标准标识符之间的联系和区别:
        保留字是语言预先确定了的词法单元,程序员不能对其重新定义含义。如Pascal语言的type和procedure等。词法分析器读到一个符合标识符规范的词法单元时,都要和保留字进行比较,以确定该词法单元式标识符还是保留字。
        许多关键字都是保留的,如C、Java等,但是FORTRAN语言的关键字不是保留的,如IF,它可能是关键字,也可能是用户标识符。
        标准标识符是预先确定了的词法单元,但是程序员可以重新申明它的含义。在声明域内,程序员申明的含义起作用,而预先确定的含义消失。词法分析器对标准标识符没有特别的处理,由符号表管理。
     
  9. 词法分析器能查出源程序中什么样的错误?
        词法分析器对源程序采用非常局部的观点,假如关键if出现拼写错误fi,则词法分析器会将其作为一个普通的标识符交给后续阶段处理,Pascal语言要求作为实型常量的小数点后面必须有数字,如果程序中出现小数点后面没有数字的情况,则由词法分析器报错。
     

语法分析
 

  1. 什么是上下文无关文法?为什么会有上下文无关文法?
        为什么:因为正规式只能定义一些简单的语言,很多较复杂的语言不能够用正规式表达,只能描述给定结构的固定次数的重复或者不指定次数的重复。例如正规式不能描述配对和嵌套的结构。 
        定义:上下文无关文法G是一个四元组(Vt,Vn,S,P),其中Vt为终结符,Vn为非终结符,S为开始符号,P为生成式集合,形式为  A→ α。

        注意:上下文无关文法也只能描述编程语言语法上的大部分规定,而不是所有的规定。如:输入串的上下文有关限制,要求标识符的申明必须先于它们的使用,就不能用上下文无关文法来描述
     
  2. 什么是推导?什么是句型?什么是句子?什么是最左推导?什么是最右推导?
        推导:把产生式看成重写规则,把符号串中的非终结符用其产生式右部的串来代替,形成一个代换序列,这个代换序列就是推导。其形式为S⇒ E,⇒称为“一步推导”, ⇒*称为“零步或多步推导”,⇒+称为“一步或多步推导”。
        句型:S⇒*α,α可能包含有非终结符,则把α称为文法G的句型。
        句子:只含有终结符的句型。
        最左推导:在句型中出现两个及以上非终结符时,需要决定下一步推导代换哪一个非终结符,如果每次替换最左边的非终结符,则称为最左推导,记为α⇒lm*β。类似,每次替换最右边的非终结符。最右推导又称为规范推导,记为α⇒rm*β。
     
  3. 分析树及二义性:
        分析树是推导的图像化表示,分析树非叶节点都是非终结符,叶节点是非终结符或终结符。从左到右扫描叶子节点构成一个句型,最左推导和最右推导的分析树是一样。
        二义性:如果一个文法,存在某个句子有不止一颗分析树,那么称这个文法是二义的。注意:文法二义并不代表语言一定是二义的,只有当一个语言的所有文法都是二义时,这个语言称为二义的。
        
  4. 正规式和上下文无关文法的比较?为什么还要保留正规式?
        正规式可以描述的语言都能用上下文无关文法来描述。使用正规式定义语言有下面这些优点:
        ①语言的词法规则非常简单,不必要再使用功能更强大的上下文无关文法。
        ②对于词法记号,正规式给出的描述更简洁且易于理解。
        ③从正规式自动构造出的词法分析器比上下文无关文法构造出的更有效
        
  5. 为什么要分离词法分析器?
        正规式是描述标识符、常数和关键字等词法结构的最有力武器。上下文无关文法是描述括号配对、begin 和 end配对、语句嵌套、表达式嵌套等结构的最有力武器。如果将词法分析结合到语法分析中,会导致文法复杂度加大,实现起来更加复杂,将额外处理空白和注释。将词法分析和语法分析分离是由上面的3条优点决定的,同时进行分离有下面这些好处:
        ①编译器的效率会改进。词法分析器的分离可以简化词法分析器的设计,允许构造专门的和更有效的词法分析器。编译时有相当一部分时间消耗在读源程序和把它分成一个个记号上,所以采用分离技术使得编译处理速度更快。
        ②编译器的可移植性加强。输入字符集的特殊性和其他与设备有关的不规则性可以被限制在词法分析器中处理。
        ③进行语法和词法的划分,为编译器的前端的模块化提供了途径。

     
  6. 消除二义性:
        ①在构造表达式文法时,定义好算符优先级和算符结合律,使得语法分析树是唯一的。
        ②消除“悬空else”类型的条件语句,使得出现在then 和 else 之间的语句都是配对的。
         但其实大多数编程语言都不用无二义的文法,而采用二义文法,因为二义文法更简洁且可以使用消除规则消除二义性。


     
  7. 消除左递归:
        消除左递归文法可以使用自上而下的分析方法,其形式为A ⇒ +Aα;由行为A ⇒Aα的产生式引起的左递归称为直接左递归。
        
    左递归产生式A ⇒Aα | β可以如下非递归来替代:
     A  → βA'
     A' →α|A'|ε
    
    因为左递归式的输出为以β开头的任意长度α的串,βααα...
    首先把A产生式组合在一起:A → Aα1|Aα2|...|Aαm|β1|β2|...|βn|
    其中βi都不以A开始,αi都非空,然后用
    A → β1A'|β2A'|...|βnA'
    A' → α1A'|α2A'|... |αmA'|ε 替换A的递归产生式即可

  8. 提左因子:
        有利于产生适合于自上而下分析的文法,当如果A→αβ1 |αβ2 是A的两个产生式,当不清楚该选择哪个非终结符时,可以提出公共左因子α,推迟这个决定。

    将A→αβ1 |αβ2修改为
    A → αA'
    A' → β1 |β2 
  9. 上下文相关文法的语言构造:
        抽象语言L1 = {wcw | w属于(a | b)*},这个句子的特点就是前后是由a,b组合的相同的串,中间使用c隔开。例如aabcaab。这个句子是对程序中标识符的申明应该先于其引用的抽象第一个w代表了标识符(a|b)*的申明,第二个则是对第一个的具体引用。所以这是一个上下文相关文法,意味着C和Java都是上下文相关的语言,因为他们都要求申明先于引用,且标识符允许任意长。所以在对这类语言进行描述时,使用id来表示未知的所有标识符。

    同理,下面这些也都是上下文相关语言:
    1:L2 = {a^n b^m c^n d^m |n≥0,m≥0}
    2: L3 = {a^n b^n c^n |n≥0}
    因为后面的参数必须由前面先定义,再使用。但是并不仅仅是看先后顺序判断
    
    例如,下面的全都是上下文无关语言:
    1:L1' = {wcw^R |w 属于(a|b)*},R表示逆序的w,
        S → aSa | bSb |c
    2: L2' = {a^n b^m c^m d^n |n≥1,m≥1}
        S → aSd | aAd
        A → bAc |bc
    3:L2'' = {a^n b^n c^m d^m |n≥1,m≥1}
        S → AB
        A → aAb |ab
        B → cBd |cd
    4:L3' = {a^n b^n |n≥1}
        S → aSb |ab
    通过观察发现,形式存在着 对称性 ,可以拆分为上下文无关语言
  10. 乔姆斯基-形式语言:
    形式语言分为四种类型,由强到弱的是0型、1型、2型、3型。

     


  11.  

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值