预处理:处理空行,注释等
词法分析可一行之后,就让语法分析去,而不是全部词法分析完。
fortran真是厉害啊。。。。。
位置在201号单元,遇到A1,根据二元式,指明其在符号表中的位置。
常量有多个表,对应多个表;但是标识符只有一个表。
第16 17 18讲为习题课,没有听。
上下文无关文法是语法分析的基础。
有限自动机 五元组(状态集,字母表,映射关系,初始状态,终结状态)
下推自动机:七元组 Q状态集,字母表,H下推栈栈内的字母表,映射(映射会改变栈的和状态机的状态)
q0,初始状态 Z0栈的初始状态 F终态集
r是栈顶元素的变化 q是状态的变化
推导,当栈顶是非终结符A的时候,如果遇到空串可以推出另一个终结符w,即为推导。
如果栈顶是个非终结符,就将其推导为终结符;如果是终结符,就与待处理的字符进行比对。
S为栈底的状态
如果栈内是a,输入的是b,那么是错误的,标记即可。
栈底初始符号S #用于标志栈底以及句子结束
(q,aacbb,aSb)中 aSb为栈内符号,aacbb是输入的凡此
究竟是选择哪一个进行分析,即(q,aSb),(q,c)有两种选择
这就带来了回溯的问题
栈空且输入完时,说明匹配完毕。
回溯,如果能回溯,就要知道回溯点的状态,这就占据了程序空间。
需要注意左递归会引起的无限循环。
第21讲:
上下文无关文法中应当没有左递归
主要的核心在于排序后,序号小的不适用序号大的,但是序号大的使用序号小的。
消除左递归之后,已经无法从S推出P和Q了,就删掉。
注意:是将所有的Pk都替代掉之后,在进行直接左递归。
如果候选式的左部开头相同,那么一开始无法区分,因此就需要提取左因子。
上下文无关文法允许产生式右边有非终结符,
将栈顶元素从将a替换为阿法
预测分析表中保存first集
Vn是非终结符
为什么会引入follow集合?因为如果非终结符有空串,那么非终结符的follow集合应当用于匹配
化简,消除左递归,first集合,提取左公因子,如果某一个符号的终结首符集合中有空串,那么那么就要求随附集。
在候选表中,填写的是候选式的first集合,而不是非终结符的
注意,非终结符的first集合中有空串时,则将该非终结符的预测分析表中的follow集合的相应元素填上空串,表示,当遇到这个符号时,则E作为空串,可以直接弹出。应当用在栈里E下面的那个符号去匹配。
26 25讲和24讲开头部分是习题课,略
第27讲
遇到句柄规约为非终结符
自顶向下是将栈顶符号替换为非终结符,展开进行匹配。
自下而上则是将终结符读入栈中,形成句柄时,替换为非终结符,逐步规约为开始符号。
不能存在s->ab c->ab,这样就不知道到底规约成哪个了。
注意是所有的符号,包括终结符和非终结符。
优先级的比较只比较终结符的,不比较非终结符的。
#小于任何一个终结符