编译原理LL(1)文法分析器实验(java).doc

上传人:b****9 文档编号:135033 上传时间:2022-10-04 格式:DOC 页数:11 大小:258.50KB
下载 相关 举报
编译原理LL(1)文法分析器实验(java).doc_第1页
第1页 / 共11页
编译原理LL(1)文法分析器实验(java).doc_第2页
第2页 / 共11页
编译原理LL(1)文法分析器实验(java).doc_第3页
第3页 / 共11页
编译原理LL(1)文法分析器实验(java).doc_第4页
第4页 / 共11页
编译原理LL(1)文法分析器实验(java).doc_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

编译原理LL(1)文法分析器实验(java).doc

《编译原理LL(1)文法分析器实验(java).doc》由会员分享,可在线阅读,更多相关《编译原理LL(1)文法分析器实验(java).doc(11页珍藏版)》请在冰豆网上搜索。

编译原理LL(1)文法分析器实验(java).doc

编译原理LL

(1)文法分析器实验

本程序是基于已构建好的某一个语法的预测分析表来对用户的输入字符串进行分析,判断输入的字符串是否属于该文法的句子。

基本实现思想:

接收用户输入的字符串(字符串以“#”表示结束)后,对用做分析栈的一维数组和存放分析表的二维数组进行初始化。

然后取出分析栈的栈顶字符,判断是否为终结符,若为终结符则判断是否为“#”且与当前输入符号一样,若是则语法分析结束,输入的字符串为文法的一个句子,否则出错若不为“#”且与当前输入符号一样则将栈顶符号出栈,当前输入符号从输入字符串中除去,进入下一个字符的分析。

若不为“#”且不与当前输入符号一样,则出错。

若栈顶符号为非终结符时,查看预测分析表,看栈顶符号和当前输入符号是否构成产生式,若产生式的右部为ε,则将栈顶符号出栈,取出栈顶符号进入下一个字符的分析。

若不为ε,将产生式的右部逆序的入栈,取出栈顶符号进入下一步分析。

程序流程图:

本程序中使用以下文法作对用户输入的字符串进行分析:

E→TE’

E’→+TE’|ε

T→FT’

T’→*FT’|ε

F→i|(E)

该文法的预测分析表为:

1、显示预测分析表,提示用户输入字符串

2、输入的字符串为正确的句子:

3、输入的字符串中包含了不属于终结符集的字符

4、输入的字符串不是该文法能推导出来的句子

程序代码:

package;

importjava.io.*;

publicclassLL{

StringVn[]={"E","E'","T","T'","F"};//非终结符集

StringVt[]={"i","+","*","(",")","#"};//终结符集

StringP[][]=newString[5][6];//预测分析表

Stringfenxi[];//分析栈

intcount=1;//步骤

intcount1=1;//’分析栈指针

intcount2=0,count3=0;//预测分析表指针

StringinputString="";//输入的字符串

booleanflag;

publicvoidsetCount(intcount,intcount1,intcount2,intcount3){

this.count=count;

this.count1=count1;

this.count2=count2;

this.count3=count3;

flag=false;

}

publicvoidsetFenxi(){//初始化分析栈

fenxi=newString[20];

fenxi[0]="#";

fenxi[1]="E";

}

publicvoidsetP(){//初始化预测分析表

for(inti=0;i<5;i++){

for(intj=0;j<6;j++){

P[i][j]="error";

}

}

P[0][0]="->TE'";

P[0][3]="->TE'";

P[1][1]="->+TE'";

P[1][4]="->ε";

P[1][5]="->ε";

P[2][0]="->FT'";

P[2][3]="->FT'";

P[3][1]="->ε";

P[3][2]="->*FT'";

P[3][4]="->ε";

P[3][5]="->ε";

P[4][0]="->i";

P[4][3]="->(E)";

//打印出预测分析表

System.out.println("已构建好的预测分析表");

System.out.println("----------------------------------------------------------------------");

for(inti=0;i<6;i++){

System.out.print(""+Vt[i]);

}

System.out.println();

System.out.println("----------------------------------------------------------------------");

for(inti=0;i<5;i++){

System.out.print(""+Vn[i]+"");

for(intj=0;j<6;j++){

intl=0;

if(j>0){

l=10-P[i][j-1].length();

}

for(intk=0;k

System.out.print("");

}

System.out.print(P[i][j]+"");

}

System.out.println();

}

System.out.println("----------------------------------------------------------------------");

}

publicvoidsetInputString(Stringinput){

inputString=input;

}

publicbooleanjudge(){

StringinputChar=inputString.substring(0,1);//当前输入字符

booleanflage=false;

if(count1>=0){

for(inti=0;i<6;i++){

if(fenxi[count1].equals(Vt[i])){//判断分析栈栈顶的字符是否为终结符

flage=true;

break;

}

}

}

if(flage){//为终结符时

if(fenxi[count1].equals(inputChar)){

if(fenxi[count1].equals("#")&&inputString.length()==1){//栈顶符号为结束标志时

//System.out.println("最后一个");

Stringfenxizhan="";

for(inti=0;i<=P.length;i++){//拿到分析栈里的全部内容(滤去null)

if(fenxi[i]==null){

break;

}else{

fenxizhan=fenxizhan+fenxi[i];

}

}

//输出当前分析栈情况,输入字符串,所用产生式或匹配

System.out.print(""+count);

StringcountToString=Integer.toString(count);

intfarWay=14-countToString.length();

for(intk=0;k

System.out.print("");

}

System.out.print(fenxizhan);

farWay=20-fenxizhan.length();

for(intk=0;k

System.out.print("");

}

System.out.print(inputString);

farWay=25-inputString.length();

for(intk=0;k

System.out.print("");

}

System.out.println("接受");

flag=true;

returntrue;

}else{//分析栈栈顶符号不为结束标志符号时

Stringfenxizhan="";

for(inti=0;i<=P.length;i++){//拿到分析栈里的全部内容(滤去null)

if(fenxi[i]==null){

break;

}else{

fenxizhan=fenxizhan+fenxi[i];

}

}

//输出当前分析栈情况,输入字符串,所用产生式或匹配

System.out.print(""+count);

StringcountToString=Integer.toString(count);

intfarWay=14-countToString.length();

for(intk=0;k

System.out.print("");

}

System.out.print(fenxizhan);

farWay=20-fenxizhan.length();

for(intk=0;k

System.out.print("");

}

System.out.print(inputString);

farWay=25-inputString.length();

for(intk=0;k

System.out.print("");

}

System.out.println("\""+inputChar+"\""+"匹配");

//将栈顶符号出栈,栈顶指针减一

fenxi[count1]=null;

count1-=1;

if(inputString.length()>1){//当当前输入字符串的长度大于1时,将当前输入字符从输入字符串中除去

inputString=inputString.substring(1,inputString

.length());

}else{/

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 表格模板 > 表格类模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1