实验二 LL1语法分析器文档格式.docx
- 文档编号:20479749
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:35
- 大小:281.66KB
实验二 LL1语法分析器文档格式.docx
《实验二 LL1语法分析器文档格式.docx》由会员分享,可在线阅读,更多相关《实验二 LL1语法分析器文档格式.docx(35页珍藏版)》请在冰豆网上搜索。
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;
yn_null[j]!
j++)//所求非终结符
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验二 LL1语法分析器 实验 LL1 语法 分析器
![提示](https://static.bdocx.com/images/bang_tan.gif)