编译原理语法分析器java完美运行版教学文案Word文档下载推荐.docx

上传人:b****5 文档编号:18758782 上传时间:2023-01-01 格式:DOCX 页数:35 大小:281.77KB
下载 相关 举报
编译原理语法分析器java完美运行版教学文案Word文档下载推荐.docx_第1页
第1页 / 共35页
编译原理语法分析器java完美运行版教学文案Word文档下载推荐.docx_第2页
第2页 / 共35页
编译原理语法分析器java完美运行版教学文案Word文档下载推荐.docx_第3页
第3页 / 共35页
编译原理语法分析器java完美运行版教学文案Word文档下载推荐.docx_第4页
第4页 / 共35页
编译原理语法分析器java完美运行版教学文案Word文档下载推荐.docx_第5页
第5页 / 共35页
点击查看更多>>
下载资源
资源描述

编译原理语法分析器java完美运行版教学文案Word文档下载推荐.docx

《编译原理语法分析器java完美运行版教学文案Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《编译原理语法分析器java完美运行版教学文案Word文档下载推荐.docx(35页珍藏版)》请在冰豆网上搜索。

编译原理语法分析器java完美运行版教学文案Word文档下载推荐.docx

输出的格式如下:

5、实验源程序

LL1.java

importjava.awt.*;

importjava.awt.event.*;

importjavax.swing.*;

importjavax.swing.table.DefaultTableModel;

importjava.sql.*;

importjava.util.Vector;

publicclassLL1extendsJFrameimplementsActionListener

{

/**

*

*/

privatestaticfinallongserialVersionUID=1L;

JTextFieldtf1;

JTextFieldtf2;

JLabell;

JButtonb0;

JPanelp1,p2,p3;

JTextAreat1,t2,t3;

JButtonb1,b2,b3;

JLabell0,l1,l2,l3,l4;

JTabletable;

Statementsta;

Connectionconn;

ResultSetrs;

DefaultTableModeldtm;

StringVn[]=null;

Vector<

String>

P=null;

intfirstComplete[]=null;

//存储已判断过first的数据

charfirst[][]=null;

//存储最后first结果

intfollowComplete[]=null;

//存储已判断过follow的数据

charfollow[][]=null;

//存储最后follow结果

charselect[][]=null;

//存储最后select结果

intLL=0;

//标记是否为LL

(1)

Stringvt_tou[]=null;

//储存Vt

Objectshuju[][]=null;

//存储表达式数据

charyn_null[]=null;

//存储能否推出空

LL1()

{

setLocation(100,0);

setSize(700,780);

tf1=newJTextField(13);

tf2=newJTextField(13);

l=newJLabel("

>

"

);

l0=newJLabel("

输入字符串:

l1=newJLabel("

输入的文法为:

"

l2=newJLabel("

l3=newJLabel("

分析的结果:

l4=newJLabel("

预测分析表:

//p1=newJPanel();

p2=newJPanel();

p3=newJPanel();

t1=newJTextArea(24,20);

t2=newJTextArea(1,30);

t3=newJTextArea(24,40);

b0=newJButton("

确定(S为开始)"

b1=newJButton("

判断文法"

b2=newJButton("

输入"

b3=newJButton("

清空"

table=newJTable();

JScrollPanejp1=newJScrollPane(t1);

JScrollPanejp2=newJScrollPane(t2);

JScrollPanejp3=newJScrollPane(t3);

p2.add(tf1);

p2.add(l);

p2.add(tf2);

p2.add(b0);

p2.add(b1);

p2.add(l0);

p2.add(l2);

p2.add(jp2);

p2.add(b2);

p2.add(b3);

p2.add(l1);

p2.add(l3);

p2.add(jp1);

p2.add(jp3);

p3.add(l4);

p3.add(newJScrollPane(table));

add(p2,"

Center"

add(p3,"

South"

b0.addActionListener(this);

b1.addActionListener(this);

b2.addActionListener(this);

b3.addActionListener(this);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

table.setPreferredScrollableViewportSize(newDimension(660,200));

setVisible(true);

}

publicvoidactionPerformed(ActionEvente)

if(e.getSource()==b0)

Stringa=tf1.getText();

Stringb=tf2.getText();

t1.append(a+'

→'

+b+'

\n'

}

if(e.getSource()==b1)

t3.setText("

intVnnum=0,k;

Vn=newString[100];

P=newVector<

();

Strings[]=t1.getText().split("

\n"

for(inti=0;

i<

s.length;

i++)

if(s.length<

2){

文法输入有误,请重新输入"

//判断长度是否符合

return;

if(s[i].charAt(0)<

='

Z'

&

s[i].charAt(0)>

A'

s[i].charAt

(1)=='

for(k=0;

k<

Vnnum;

k++)

if(Vn[k].equals(s[i].substring(0,1))){

break;

if(Vnnum==0||k>

=Vnnum)

Vn[Vnnum]=s[i].substring(0,1);

//存入Vn数据

Vnnum++;

P.add(s[i]);

else

yn_null=newchar[100];

first=newchar[Vnnum][100];

intflag=0;

StringfirstVn[]=null;

firstComplete=newint[Vnnum];

Vn[i]!

=null;

i++)//依次求FIRST**

flag=0;

firstVn=newString[20];

if((flag=add_First(first[i],Vn[i],firstVn,flag))==-1)return;

firstComplete[i]=1;

t3.append("

first集:

+"

//显示FIRST**

first("

+Vn[i]+"

)={"

for(intj=0;

first[i][j]!

\0'

;

j++)

t3.append(first[i][j]+"

"

}"

follow=newchar[Vnnum][100];

StringfollowVn[]=null;

followComplete=newint[Vnnum];

i++)//求FOLLOW**

followVn=newString[20];

if((flag=tianjiaFollow(follow[i],Vn[i],followVn,flag))==-1)return;

followComplete[i]=1;

follow集:

//显示FOLLOW**

follow("

follow[i][j]!

t3.append(follow[i][j]+"

select=newchar[P.size()][100];

P.size();

i++)//求SELECT**

tianjiaSelect(select[i],(String)P.elementAt(i),flag);

select集:

//显示SELECT**

select("

+(String)P.elementAt(i)+"

select[i][j]!

t3.append(select[i][j]+"

i++)//判断select交集是否为空

intbiaozhi=0;

charsave[]=newchar[100];

j<

Stringt=(String)P.elementAt(j);

if(t.substring(0,1).equals(Vn[i]))

select[j][k]!

if(puanduanChar(save,select[j][k]))

save[biaozhi]=select[j][k];

biaozhi++;

else//当有交集时,不为LL

(1)文法

不是LL

(1)文法!

charVt[]=newchar[100];

Stringt=(String)P.elementAt(i);

for(intj=2;

t.length();

j++)//提取表达式右侧的终结符存入Vt

if(t.charAt(j)>

'

||t.charAt(j)<

if(puanduanChar(Vt,t.charAt(j)))

Vt[biaozhi]=t.charAt(j);

if(puanduanChar(Vt,'

#'

))//若可推出空集,则将#加入Vt。

Vt[biaozhi]='

vt_tou=newString[biaozhi+1];

//根据select和表达式生成预测分析表

shuju=newString[Vnnum][biaozhi+1];

Stringf="

vt_tou[0]=f;

biaozhi;

vt_tou[i+1]=String.valueOf(Vt[i]);

shuju[i][0]=Vn[i];

intj;

for(j=0;

Vn.length;

if(Vn[j].equals(t.substring(0,1)))

select[i][k]!

inty=puanduanXulie(Vt,select[i][k]);

shuju[j][y+1]=t.substring

(1);

dtm=newDefaultTableModel(shuju,vt_tou);

//显示预测分析表

table.setModel(dtm);

LL=1;

if(e.getSource()==b3)//清空列表

tf1.setText("

tf2.setText("

t1.setText("

t2.setText("

Vn=null;

firstComplete=null;

first=null;

followComplete=null;

follow=null;

select=null;

dtm=newDefaultTableModel();

if(e.getSource()==b2)//输入字符串并预测分析

if(LL==1)

Strings=t2.getText();

s.length();

if(s.charAt(i)=='

字符串中请不要加入空格"

charzifu[]=newchar[100];

//剩余输入串

charfenxi[]=newchar[100];

//分析栈

zifu[0]='

fenxi[1]='

S'

fenxi[0]='

intfzifu=1;

intffenxi=2;

for(inti=s.length()-1;

i>

=0;

i--)

zifu[fzifu]=s.charAt(i);

fzifu++;

intbuzhou=2;

charn[]=newchar[65];

//存储要显示的内容

步骤分析栈剩余输入串所用产生式或匹配"

n[0]='

1'

n[15]='

n[14]='

intu=29;

for(inti=fzifu-1;

n[u]=zifu[i];

u++;

while(!

(fenxi[ffenxi-1]=='

zifu[fzifu-1]=='

))//剩余输入串不为#则分析

inti,j;

chart=zifu[fzifu-1];

chark=fenxi[ffenxi-1];

if(t==k)//产生式匹配

n[49]=k;

n[50]='

匹'

n[51]='

配'

t3.append(String.copyValueOf(n)+"

n=newchar[65];

fzifu--;

ffenxi--;

if(buzhou<

10)

n[0]=(char)('

0'

+buzhou);

//显示步骤数

+buzhou/10);

n[1]=(char)('

+buzhou%10);

u=14;

for(inty=ffenxi-1;

y>

y--)//处理分析栈,出栈

n[u]=fenxi[y];

u=29;

for(inty=fzifu-1;

y--)//处理剩余字符串,消除一个字符

n[u]=zifu[y];

buzhou++;

continue;

for(i=0;

i++)//搜寻所用产生式的左部

if(Vn[i].equals(String.valueOf(k)))break;

vt_tou.length;

j++)//判断是否匹配

if(vt_tou[j].equals(String.valueOf(t)))break;

if(j>

=vt_tou.length)//全部产生式都不能符合则报错

t3.append(String.copyValueOf(n));

该串不是该文法的句型"

Objectresult1=shuju[i][j];

if(result1==null)

else//找到所用产生式

{

n[49]=Vn[i].charAt(0);

u=50;

Stringresult=(String)result1;

for(inty=0;

y<

result.length();

y++)

n[u]=result.charAt(y);

for(i=result.length()-1;

0;

i--)//将分析栈内非终结符换为右边表达式

if(result.charAt(i)!

fenxi[ffenxi]=result.charAt(i);

ffenxi++;

10)//显示“步骤”

y--)

n[29]='

n[49]='

分'

析'

成'

n[52]='

功'

该串是此文法的句型"

请先依次输入LL

(1)文法,并点击文法判断按钮"

privateintadd_First(chara[],Stringb,StringfirstVn[],intflag)//计算FIRST**(递归)

if(puanduanString(firstVn,b.charAt(0))){addString(firstVn,b);

}

returnflag;

for(intk=2;

if(t.substring(0,1).equals(b))

if(t.charAt(k)>

||t.charAt(k)<

)//表达式右端第i个不是非终结符

if(flag==0||puanduanChar(a,t.charAt(k)))

if(t.charAt(k)=='

)//#时直接加入first

if(k+1==t.length())

a[flag]=t.charAt(k);

flag++;

intflag1=0;

for

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

当前位置:首页 > 医药卫生 > 基础医学

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

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