一、编译过程【回顾】
中间代码生成、代码优化,可省略。
二、正规式
词法分析的工具。
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: