编译原理复习(二)

零碎知识点

  1. 正规式等价是指两个正规式所识别的语言集相等
  2. 中间代码生成时所依据的是:语义规则
  3. 编译程序绝大多数时间花在管理表格
  4. 词法分析器的输出结果是单词的种别编码和自身值
  5. 堆式动态分配申请和释放存储空间遵循任意原则
  6. 并不是每个文法都能改写成LL(1)文法
  7. LR分析器由三部分构成:总控程序分析表分析栈
  8. 自底而上语法分析方法的主要问题是什么?
  9. 什么是简单优先文法
  10. 什么是算符优先文法
  11. 文法G所描述的语言是由文法的开始符号推出的所有终结符号串的集合
  12. 非LL(1)文法变为LL(1)文法可以使用消除左递归提取左公因子两种方法
  13. 三种级别的优化:局部优化循环优化全局优化

求文法的FIRST集、FOLLOW集、SELECT集并判断文法是否为LL(1)文法:

例题:

文法G[E]:

E->TE'
E'->+E|ε
T->FT'
T'->T|ε
F->PF'
F'->*F'|ε
P->(E)|a|b|^ 

一、求出能推算出ε的非终结符

创建表:

非终结符 E E’ T T’ F F’ P
多遍扫描后

二、求FIRST集

定义

在这里插入图片描述

设G=(VT,VN,S,P)是上下文无关文法 ,FIRST(α)={a|α能推导出aβ,a∈VT,α,β∈V*}   
特别的,若α能推导出ε,则规定ε∈FIRST(α).

结果

FIRST(E)=FIRST(T)=FIRST(F)=FIRST(P)={(,a,b,^};
FIRST(E')={+,ε};
FIRST(T)=FIRST(F)=FIRST(P)={(,a,b,^};
FIRST(T')=FIRST(T)∪{ε}={(,a,b,^,ε};
FIRST(F)=FIRST(P)={(,a,b,^};
FIRST(F')=FIRST(P)={*,ε};
FIRST(P)={(,a,b,^};

三、求FOLLOW集

定义

在这里插入图片描述

结果

FOLLOW(E)={),#};  
FOLLOW(E')=FOLLOW(E)={),#};  
FOLLOW(T)=FIRST(E')∪FOLLOW(E)={+,),#};不包含ε
FOLLOW(T')=FOLLOW(T)=FIRST(E')∪FOLLOW(E)={+,),#};
FOLLOW(F)=FIRST(T')∪FOLLOW(T)={(,a,b,^,+,),#};//不包含ε
FOLLOW(F')=FOLLOW(F)=FIRST(T')∪FOLLOW(T)={(,a,b,^,+,),#};
FOLLOW(P)=FIRST(F')∪FOLLOW(F)={*,(,a,b,^,+,),#};//不包含ε

四、求SELECT集

定义

在这里插入图片描述

结果

SELECT(E->TE')=FIRST(T)={(,a,b,^};
SELECT(E'->+E)={+ }; 
SELECT(E'->ε)=FOLLOW(E/)={),#};
SELECT(T->FT')=FIRST(F)={(,a,b,^}
SELECT(T'->T)=FIRST(T)={(,a,b,^};
SELECT(T'->ε)=FOLLOW(T/)={+,),#};
SELECT(F->PF')=FIRST(P)={(,a,b,^};
SELECT(F'->*F')={*};
SELECT(F'->ε)=FOLLOW(F')={(,a,b,^,+,),#};
SELECT(P->(E))={(}
SELECT(P->a)={a}
SELECT(P->b)={b}
SELECT(P->^)={^}

五、判断是否为LL(1)文法

在这里插入图片描述

由四中的SELECT集可知,相同左部产生式的SELECT集交集为空,所以该文法为LL(1)文法。

六、构造预测分析表

方法

在这里插入图片描述

结果

在这里插入图片描述

发布了13 篇原创文章 · 获赞 3 · 访问量 2752

猜你喜欢

转载自blog.csdn.net/yinyiyu/article/details/88802052