编译原理(词法分析)

…衆ロ難τιáo~ 提交于 2020-01-22 09:05:09


1.编译原理概述

程序设计语言的翻译模式:编译、汇编;转换(预处理);反汇编、反编译;交叉编译、交叉汇编

静态语义错误(如分母不为0)在语义分析阶段可以被检测出来

词法分析里的坑点,因为词法分析只是识别记号,它并不会排查声明变量结构性错误,这个错误要到语法分析之中才可以被检查出来
在这里插入图片描述
动态语义错误编译过程中一般不会处理,只有到程序执行时才会发现
在这里插入图片描述
几个错误的典型实例
在这里插入图片描述
对程序语句的翻译主要考虑两类语句:声明语句和可执行语句,其中,对声明语句,主要是将所需要的信息正确地填入合理组织的符号表中;对可执行语句,则是翻译成中间代码

在以阶段划分的编译器中,符号表管理出错处理两个阶段的工作贯穿于编译器工作始终。

有两个因素使得有限自动机是不确定的,一个是具有ε状态转移,另一个是对同一字符,可能有多于一个的下一状态转移

词法分析器有四个作用,请给出其中的任意两个:识别记号并交给语法分析器/滤掉源程序中的无用成分/处理与具体平台有关的输入/调用符号表管理器或出错管理器

语法分析器根据语法规则识别出记号流中的结构,并构造一棵能够正确反映该结构的语法树检查输入中的错误,调用出错管理器进行适当处理


2.词法分析


正规集

正规集是正规式表达的集合,比如a*b的正规集是
{ε,ab,aab,aaab…}


正规式

在这里插入图片描述
星闭包:αγ*,正闭包中包含了空串

正闭包:αγ+,不包括空串

由正闭包定义可以推出α+=αα*


正规文法

如何由正规文法推出正规式?
比如给定正规文法产生式:
S→aS | aB
B→bB | bA
A→cA | c

首先联立方程组
S=aS | aB
B=bB | bA
A=cA | c

由正规式定理,可知S=a*aB,即S=a+B

同理,B=b*bA=b+A,A=c*c=c+

此时,S和B中均包含了非终结符,还不是正规式,将B和A代入,得出
S=a+b+c+
B=b+c+
A=c+


自动机


确定有限自动机DFA
在这里插入图片描述

不确定有限自动机NFA
在这里插入图片描述
NFA与DFA最大区别在于NFA的状态读入一个字符可以到达多个后继状态,DFA是NFA的特例

NFA能否识别某个序列?
在这里插入图片描述


已知集合求正规式、DFA;


已知正规式求DFA、集合;

在这里插入图片描述
按照Thompson 算法,由正规式构造NFA
Thompson 算法中,
在这里插入图片描述
| 的关系要用这种4个ε的图来表示
在这里插入图片描述
*闭包的关系用这个图来表示


已知DFA求正规式、集合;


DFA的确定化、最小化。

NFA如何转化为DFA?
用子集法将NFA构造为DFA
建立初态的集合,然后不停地获取符号,直到不再出现新的集合为止

求最小DFA

  1. 把M的状态分为两组,终态集和非终态集合
  2. 考察非终态集合
  3. 考察终态集合
  4. 画出状态图
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!