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
- 把M的状态分为两组,终态集和非终态集合
- 考察非终态集合
- 考察终态集合
- 画出状态图
来源:CSDN
作者:Aeroblaze
链接:https://blog.csdn.net/qq_43492699/article/details/103791059