Removed_合肥工业大学编译原理实验 LL(1)分析法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验题目:LL(1)分析法 免费下载,不客气 班级:
学号:
姓名:
Edited by Magic Yang
完成日期:2013-5-28
:50 45. 44. 43. by 42.41.——40.——39.—3—8.by3@7.—— 36.35. —3—4. ——333. 12. 1.2.3.340.5.—.6.—29.by28.by@27.26.—— 25. 24. 23. 22. by 21.20. ——19.by:18.by1:7.——16.——15.——14.—— 13. 12. 1110.“. ”by:M9.O“OOKN”b8y.—: —7.——6.——5.——4.——3.——2.——1.——
一、实验目的
通过完成预测分析法的语法分析程序,了解预测分析法和递归子程序法的区 别和联系。使学生了解语法分析的功能,掌握语法分析程序设计的原理和构造 方法,训练学生掌握开发应用程序的基本方法。有利于提高学生的专业素质, 为培养适应社会多方面需要的能力。
二、实验内容
根据某一文法编制调试 LL ( 1 )分析程序,以便对任意输入的符号 串进行分析。
构造预测分析表,并利用分析表和一个栈来实现对上述程序设计语言的 分析程序。
分析法的功能是利用 LL(1)控制程序根据显示栈栈顶内容、向前看符 号以及 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
fi[v][vt('ε')]=true; return ; } if(s.charAt(j+1)!='|'){//s.charAt(j+1)不是“|”就将 s.charAt(j+1)的 first 集加入 s.charAt(0)的 first 集 j++; addfi(s,j); }else{//s.charAt(j+1)是“|”就将 ε 加入 s.charAt(0)的 first 集 fi[v][vt('ε')]=true; } } } } void first(char v){//求非终结符 v 关于该文法的 first 集 int i,j; String s; for(i=0;i<Gr.length;i++){ s=Gr[i]; if(s.charAt(0)==v){//产生式的左边是要求的非终结符 j=3;
:50 45. 44. 43. by 42.41.— 4—0.— 3—9.—3—8.by37@.—— 36.35. —34—. ——33.312. 1.2.3.34.0.5.6—.—29.by28.by@27.26.—— 25. 24. 23. 22. by 21.20. — 1—9.by:18.by:17.— 1—6.— 1—5.—1—4.—— 13. 12. 111.0“. ”by: 9M.“OOOKN”b8y.:——7.——6.——5.——4.——3.——2.——1.——
表示该终结符在该行对应的非终结符的 first 集中 boolean fo[][]=new boolean[Vn.length][Vt.length+1];//follow 集,为
真表示该终结符在该行对应的非终结符的 follow 集中 String M[][]=new String[Vn.length][Vt.length-1];//预测分析表 String Gr[]={"E->TG","G->+TG|-TG","G->ε","T->FS","S-
3、数据结构及生成的算法描述
事先已经构造好的表: Vn数组------非终结符表 Vt 数组------终结符 Gr 数组------文法 事先定义的表及变量:
非终结符按照在非终结符中的位置与first集follow集对应
fi二维数组------first集,为真表示该终结符在该行对应的非终结符的first集 中 fo二维数组------follow集,为真表示该终结符在该行对应的非终结符的follow 集中 M二维数组------预测分析表 用到的方法: int or(int i,String s)---返回最近的在其右边一个“|”位置 int vn(char c)---返回 c 在非终结符表中的位置 int vt(char c)---返回 c 在终结符表中的位置 void addfi(String s, int j)---求关于某一个产生式的first集 void first(char v)---求非终结符c关于该文法的first集,first调用addfi void fir()---求所以非终结符的 first 集,fir 调用 first void addfo(String s,int j)---求关于某一个产生式的 follow 集 void follow(char v)---求非终结符 v 关于该文法的 follow 集,follow 调用 addfo void fol()---求所以非终结符的 follow 集,fol 调用 follow void MM(int j,int i,String s,int m)---将某一个产生式填入预测分析表中 void build_M()---构造预测分析表,build_M 调用 MM void isright(String s)---分析一个符号串是否符合该文法
int i; for(i=0;i<Vt.length;i++){
if(c==Vt[i])return i;//在表中,就返回位置 } return -1;//返回-1 表示不在表中 } void addfi(String s, int j){//求关于某一个产生式的 first 集 int v=vn(s.charAt(0));//v 为产生式左边的非终结符 int i; if(vt(s.charAt(j))!=-1){//产生式右边第一个为终结符
:50 45. 44. 43. by 42.41.— 4—0.— 3—9.—3—8.by37@.—— 36.35. —34—. ——33.312. 1.2.3.34.0.5.6—.—29.by28.by@27.26.—— 25. 24. 23. 22. by 21.20. — 1—9.by:18.by:17.— 1—6.— 1—5.—1—4.—— 13. 12. 111.0“. ”by: 9M.“OOOKN”b8y.:——7.——6.——5.——4.——3.——2.——1.——
4、算法流程图
:50 45. 44. 43. by 42.41.— 4—0.— 3—9.—3—8.by37@.—— 36.35. —34—. ——33.312. 1.2.3.34.0.5.6—.—29.by28.by@27.26.—— 25. 24. 23. 22. by 21.20. — 1—9.by:18.by:17.— 1—6.— 1—5.—1—4.—— 13. 12. 111.0“. ”by: 9M.“OOOKN”b8y.:——7.——6.——5.——4.——3.——2.——1.——
:50 45. 44. 43. by 42.41.— 4—0.— 3—9.—3—8.by37@.—— 36.35. —34—. ——33.312. 1.2.3.34.0.5.6—.—29.by28.by@27.26.—— 25. 24. 23. 22. by 21.20. — 1—9.by:18.by:17.— 1—6.— 1—5.—1—4.—— 13. 12. 111.0“. ”by: 9M.“OOOKN”b8y.:——7.——6.——5.——4.——3.——2.——1.——
if(s.charAt(0)!=s.charAt(j))//要求的非终结符与右边第一个不 同时,求 first 集
addfi(s,j); //求关于此产生式的 first 集 while(or(j,s)!=-1&&j<s.length())//判断有无‘|’,有就继续 求 first 集 {
j=or(j,s);//得到‘|’位置 if(s.charAt(0)!=s.charAt(j+1))//要求的非终结符与右边第 一个不同时,求 first 集
>*FS|/FS","S->ε","F->(E)","F->i"};//文法 LL(){ fir();//求 first 集 fol();//求 follow 集 build_M();//求预测分析表 } int or(int i,String s){//返回最近的在其右边一个“|”位置 for(i=i+1;i<s.length();i++){ if(s.charAt(i)=='|') return i;//存在,就返回位置 } return -1;//返回-1 表示没有“|”在其右边 }
} for(i=0;i<Vt.length;i++){//把 s.charAt(j)的 first 集中不为 ε 的加入 s.charAt(0)的 first 集
if(fi[vn(s.charAt(j))][i]&&Vt[i]!='ε'){
fi[v][i]=true; } } if(vt('ε')!=-1)//终结符中有 ε if(fi[vn(s.charAt(j))][vt('ε')]){//如果 ε 属于当前 s.charAt(j)的 first 集 if(j==s.length()-1){//j=s.length()-1 就将 ε 加入 s.charAt(0)的 first 集
Baidu Nhomakorabea
int vn(char c){//返回 c 在非终结符表中的位置 int i; for(i=0;i<Vn.length;i++){ if(c==Vn[i])return i;//在表中,就返回位置 } return -1;//返回-1 表示不在表中
} int vt(char c){//返回 c 在终结符表中的位置
fi[v][vt(s.charAt(j))]=true;//就把 s.charAt(j)加入 s.charAt(0)的 first 集
}else{//产生式右边第一个为非终结符 if(!fi[vn(s.charAt(j))][Vt.length]){//如果 s.charAt(j)的
first 集没有求,先求 s.charAt(j)的 first 集 first(s.charAt(j));
5、源程序代码和测试的结果 package package_two;
import java.util.*; import java.io.*;
public class LL { char Vn[]={'E','T','G','F','S'};//非终结符 char Vt[]={'+','-','*','/','(',')','i','#','ε'};//终结符 //非终结符按照在非终结符中的位置与 first 集 follow 集对应 boolean fi[][]=new boolean[Vn.length][Vt.length+1];//first 集,为真
addfi(s,j+1);//求关于此产生式的 first 集
} } } fi[vn(v)][Vt.length]=true;//将 fi[vn(v)][Vt.length]设为 true, 表示已求 v 的 first 集 } void fir(){//求所以非终结符的 first 集 int i,j; for(i=0;i<Vn.length;i++){//非终结符的 first 集未求时,求该非终 结符的 first 集 if(!fi[i][Vt.length]){
:50 45. 44. 43. by 42.41.— 4—0.— 3—9.—3—8.by37@.—— 36.35. —34—. ——33.312. 1.2.3.34.0.5.6—.—29.by28.by@27.26.—— 25. 24. 23. 22. by 21.20. — 1—9.by:18.by:17.— 1—6.— 1—5.—1—4.—— 13. 12. 111.0“. ”by: 9M.“OOOKN”b8y.:——7.——6.——5.——4.——3.——2.——1.——
相关文档
最新文档