编译原理笔记
![在这里插入图片描述](https://img-blog.csdnimg.cn/ac968f9e296740a280383ce12902b838.png)
构造文法
参考文档 https://www.doc88.com/p-9436653550668.html
自顶向下、自底向上、子树、直接子树
二义性文法、非二义性文法
短语、直接短语、句柄
直接短语和句柄的结果 以下图为准。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
综上结果为:
短语 P,T*F,(T*F),P↑(T*F),T*P↑(T*F)
直接短语 P,T*F
句柄 P
化简文法
右线性文法
重点1
消除左递归
FIRST、FOLLOW集
可参考文章https://blog.csdn.net/qq_66345100/article/details/124520295
多个符号形成的符号串的First结合:
X -> ABC…,并且A不能推导出空串ε,显然根据定义First(ABC…)=First(A)
X -> ABC…,并且A可能推导出空串ε,当A不是空串的时候,显然First(A)属于First(ABC…),但当A是空串的时候,ABC…就成了BC…,
此时根据B是否能推出空串来决定是否将First(B)加入First (ABC…)。这是一个递归的推导,
综上所述,符号串中的第一个不能推出空串的符号前面所有符号的First集合减去空串ε都属于First(ABC…),
第一个不能推出空串的 符号的First集合也属于First(ABC…)。
也就是假设A、B都可以推出空串,C不能推出空串,First(X)=(First(A)- ε) ∪ (First(B)- ε) ∪ (First(C))。
特殊的,符号串ABC...,A、B、C都可以推导出 ε ,那么把 ε 也加到First(X)中。
注意:First集合中的符号一定是终结符,终结符也包括空串ε。
LL(1)文法
LR(0)文法
不存在移进-归约冲突和归约-归约冲突则为 LR(0)文法
SLR(1)文法
SLR文法不存在归约-归约冲突,有可能存在移进-归约冲突,但是如果可以用 follow集解决则是 SLR文法。换句话说,SLR文法分析过程可以解决归约-归约冲突,但是不一定能解决移进-归约冲突。用 follow集来处理即出现移进-归约冲突的两条产生式,如果其 follow集相交为空则为 SLR文法,反之不是。当然,如果以上两种冲突都不存在自然是了。
LR(1)文法
因为 LR(1)文法的范围比较大,所以文法几乎都是 LR(1)的,现在知道的只有当合并同心集产生了归约-归约冲突时才只属于 LR(1)文法,而不属于其他文法。
LALR(1)文法
合并同心集不会产生新的移进-归约冲突,但是会产生新的归约-归约冲突,如果没产生新的归约-归约冲突就是 LALR 文法,反之不是。
可参考文章:https://blog.csdn.net/weixin_44225182/article/details/105599118
重点2
逆波兰式
中缀式
逆波兰式的逆写
四元式
布尔表达式