编译原理 实验二 LL(1)分析法
一、 实验目的
通过完成预测分析法的语法分析程序,了解预测分析法和递归子程序法的区
别和联系。使学生了解语法分析的功能,掌握语法分析程序设计的原理和构造方
法,训练学生掌握开发应用程序的基本方法。有利于提高学生的专业素质,为培
养适应社会多方面需要的能力。
二、 写出 LL(1)分析法的思想及写出符合 LL(1)分析法的文法
对文法G的句子进行确定的自顶向下语法分析的充分必要条件是,G的任意两个具有相同左部的产生式A—>α|β 满足下列条件:
(1)如果α、β均不能推导出ε,则 FIRST(α) ∩ FIRST(β) = ∅。
(2)α 和 β 至多有一个能推导出 ε。
(3)如果 β *═> ε,则 FIRST(α) ∩ FOLLOW(A) = ∅。
将满足上述条件的文法称为LL(1)文法。
First****构造:
对每一文法符号XÎVT∪VN构造FIRST(X),连续使用下面的规则,直至每个集合FIRST不再增大为止:
\1. 若XÎVT,则FIRST(X)={X}。
\2. 若XÎVN,且有产生式X→a…,则把a加入到FIRST(X)中;若X→e也是一条产生式,则把e也加到FIRST(X)中。
Follow****构造:
对于文法G的每个非终结符A构造FOLLOW(A)的办法是,连续使用下面的规则,直至每个FOLLOW不再增大为止:
\1. 对于文法的开始符号S,置#于FOLLOW(S)中;
\2. 若A→aBb是一个产生式,则把FIRST(b){e}加至FOLLOW(B)中;
\3. 若A→aB是一个产生式,或A®aBb是一个产生式而b→e (即eÎFIRST(b)),则把FOLLOW(A)加至FOLLOW(B)中。
实验要求:
1、编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。
2、如果遇到错误的表达式,应输出错误提示信息。
3、对下列文法,用 LL(1)分析法对任意输入的符号串进行分析:
(1)E->TG
(2)G->+TG|—TG
(3)G->ε
(4)T->FS
(5)S->*FS|/FS
(6)S->ε
(7)F->(E)
(8)F->i
三、 程序结构描述
函数名称及调用格式返回类型 | 参数含义 | 返回值描述 | 函数功能 |
---|---|---|---|
void init() | 无 | 无 | 用来得到终结符和非终结符 |
void createFirstSet(Character c) | 无 | 传入终结符或非终结符 | 得到一个符号的first集 |
void creatFirstMap() | 无 | 无 | 对所有终结符和非终结符得到对应的First集 |
void creatFirstSSet(String s) | 无 | 候选式 | 得到一个候选式的first集 |
void creatFirstSMap() | 无 | 无 | 得到非终结符任意候选式的first集 |
void createFollowSet(Character ch) | 无 | 一个非终结符 | 得到该终结符的follow集 |
void createFollowMap() | 无 | 无 | 得到所有非终结符的follow集 |
void creatTable() | 无 | 无 | 创建分析表 |
void print() | 无 | 无 | 打印first集,follow集和分析表 |
String getStack() | 栈中的字符串 | 无 | 返回栈中的字符串 |
void analyze() | 无 | 无 | 根据分析表进行LL(1)分析 |
MyFrame(String title) | 无 | 标题字符 | 这是构造器,为了将输出界面化 |
void actionPerformed(ActionEvent actionEvent) | 无 | 响应事件 | 主要为按钮绑定事件,进行语法分析 |
void main(String[] args)`` | 无 | Main参数 | Main方法,执行入口 |
四、 详细的算法描述
根据LL(1)文法的具体算法,首先对输入字符串进行初始化,生成终结符非终结符和产生式等。接着构造first集,follow集,还有相应的table表等,最后根据table表分析相应的句子。
五、 结果和代码
可以多次输入,输出结果也会增加到后面。
有用的话,请不要吝啬,动动小手点个赞把~