一、编译过程【回顾】

中间代码生成、代码优化,可省略。
二、正规式
词法分析的工具。

ab*:这个*针对的是b,即b可以出现0次或多次。
2-1、真题
真题1:

真题2:

真题3:

真题4:

真题5:

三、有限自动机
词法分析的工具,能正确识别正规集。
3-1、有限自动机的分类

一个状态,既可以是初态,也可以是终态。
1、确定的有限自动机-DFA
对每一个状态来说识别字符后转移的状态是唯一的。
2、不确定的有限自动机-NFA
对每一个状态(节点)来说识别字符后转移的状态是不唯一的。
【示例】:

S0识别1时,既可以转移到S0,也可以转移到S1。
注意:
一次正确的识别,识别完后,最后状态停留在终态。且每一个字符都能识别成功。
3-2、补充说明
a,b:a或者b
∑:空,即不需要识别字符,直接转移
3-3、真题
真题1:

真题2:

真题3:

真题4:

真题5:

真题6:

真题7:

真题8:

真题9:

真题10:

真题11:
真题12:

真题13:

真题14:

真题15:

真题16:
真题16:

真题17:

真题18:

真题19:

四、上下文无关文法
上下文无关文法被广泛的用于各种程序设计语言的语法规则。
4-1、文法规则

4-2、真题
真题1:

真题2:

真题3:

真题4:

真题5:

真题6:
真题7:

真题8:

选项中有括号的话,可以直接排除。
真题9:


真题10:

五、中缀式、后缀式

5-1、中缀式
a ? b
5-2、后缀式
a b ?
后缀式又叫逆波兰式。
5-3、中缀式转后缀式
直接:a ? b ——> a b ?
示例:
1+2*3-4*5 ======》123*+45*-
【注意】:
优先级相同,从右往左!!!
5-4、后缀式转中缀式
方法一: 用栈(先进后出)
遇到数字,入栈;
遇到操作符,从栈中弹出两个数字;
两个数字与运算符结合,再入栈。




注意:除数和被除数!
......
方法二、直接:a ? b ——> a b ?
扫描后缀表达式,遇到操作符,就放到前面两个数值中间。
六、语法树

6-1、中序遍历
左子树、根节点、右子树
示例:

1 - 2 *(3+4)/ 5
6-2、后序遍历
左子树、右子树、根节点
示例:
上图对应的后缀式:1234+5/*-
6-3、中缀转后缀
1 - 2 *(3+4)/ 5 ————> 1234+5/*-
由此例可知,优先级相同,从右往左!!!
如:2*(3+4)/ 5 先从左转换(3+4)/ 5
6-4、真题
真题1:

【注意】:
与的优先级>或的优先级
真题2:

真题3:
真题4:
真题5:

真题6:

真题7:

真题8:

真题9:

真题10:
真题11:
真题12:
真题13:
真题14:

真题15:
