实验二LL语法分析器Word文件下载.docx
《实验二LL语法分析器Word文件下载.docx》由会员分享,可在线阅读,更多相关《实验二LL语法分析器Word文件下载.docx(35页珍藏版)》请在冰豆网上搜索。
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
输出的格式如下:
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]+"