编译原理语法分析器.docx
- 文档编号:16652516
- 上传时间:2023-04-23
- 格式:DOCX
- 页数:39
- 大小:285.30KB
编译原理语法分析器.docx
《编译原理语法分析器.docx》由会员分享,可在线阅读,更多相关《编译原理语法分析器.docx(39页珍藏版)》请在冰豆网上搜索。
编译原理语法分析器
实验二语法分析器
一、实验目的
通过完成预测分析法的语法分析程序,了解预测分析法和递归子程序法的区别和联系。
使学生了解语法分析的功能,掌握语法分析程序设计的原理和构造方法,训练学生掌握开发应用程序的基本方法。
有利于提高学生的专业素质,为培养适应社会多方面需要的能力。
二、实验内容
根据某一文法编制调试LL
(1)分析程序,以便对任意输入的符号串进行分析。
构造预测分析表,并利用分析表和一个栈来实现对上述程序设计语言的分
析程序。
分析法的功能是利用LL
(1)控制程序根据显示栈栈顶内容、向前看符号以及LL
(1)分析表,对输入符号串自上而下的分析过程。
三、LL
(1)分析法实验设计思想及算法
模块结构:
(1)定义部分:
定义常量、变量、数据结构。
(2)初始化:
设立LL
(1)分析表、初始化变量空间(包括堆栈、结构体、数组、临时变量等);
(3)控制部分:
从键盘输入一个表达式符号串;
(4)利用LL
(1)分析算法进行表达式处理:
根据LL
(1)分析表对表达式符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示错误信息。
刃和〈程序》入
取占入符
取f入符黃
弃出挨顶符号较入况
LLCI)預测分析程序流程
四、实验要求
1、编程时注意编程风格:
空行的使用、注释的使用、缩进的使用等。
2、如果遇到错误的表达式,应输出错误提示信息。
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输出的格式如下:
(9)
i+i+i#[
五、实验源程序
LLl.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;
JLabel
l0,l1,l2,l3,l4;
JTable
table;
Statement
sta;
Connection
conn;
ResultSet
rs;
DefaultTableModeldtm;
StringVn[]=null;
Vector
int
firstComplete
[]=
null;//存储已判断过first
的数据
char
first[][]=
null;
//存储最后first结果
int
followComplete
[]=
=null;//存储已判断过follow
的数据
char
follow[][]=
null
;II存储最后follow结果
char
select[][]=
null
;II存储最后select结果
int
LL=0;//标记是否为
LL
(1)
String
vt_tou[]=
null
;II储存Vt
Object
shuju[][]=
null
;II存储表达式数据
char
yn_null[]=
null;
II存储能否推出空
LL1()
setLocation(100,0);setSize(700,780);
tf1=newJTextField(13);
tf2=newJTextField(13);
l=newJLabel(">>");
l0
=newJLabel("输入字符串:
”);
");
l1
=newJLabel("输
入
的文
法
为
丿;
l2
=newJLabel("");
");
l3
=newJLabel("分
析
的
结
果
丿;
II\.
l4
=newJLabel("预
测
分
析
表
");
〃p仁newJPanel();
p2=
=newJPanel();
p3=
=newJPanel();
t1:
=newJTextArea(24,20);
t2:
=newJTextArea(1,30);
t3:
=newJTextArea(24,40);
b0=
=newJButton("确定(S为开始)");
bl:
=newJButton(”判断文法”
b2=newJButton(”
输入");
b3=newJButton(”
清空”);
table=newJTable();
JScrollPanejp仁
newJScrollPane(
JScrollPanejp2:
=
newJScrollPane(
JScrollPanejp3:
=
newJScrollPane(
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);
t1);
t2);
t3);
p3.add(14);
p3.add(newJScrollPane(table));
add(p2,"Center");
add(p3,"South");
b0.addActionListener(this);
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
setDefaultCloseOperation(JFrame.
table.setPreferredScrollableViewportSize(
Dimension(660,200));
setVisible(true);
}
publicvoidactionPerformed(ActionEvente)
{
if(e.getSource()==b0)
{
Stringa=tf1.getText();
Stringb=tf2.getText();
t1.append(a+
t'+b+'\n');
if(e.getSource()==bl)
{
t3.setText(””);
intVnnum=0,k;
Vn=newString[100];
P=newVector
Strings[]=t1.getText().split("\n");
for(inti=0;i { if(s.length<2){ 判断长度是否符 t3.setText("文法输入有误,请重新输入”);//合 return; } if(s[i].charAt(O)<='Z'&&s[i].charAt(O)>='A'&&s[i].charAt⑴ { for(k=0;k { if(Vn[k].equals(s[i].substring(0,1))){ break; } } if(Vnnum==0||k>=Vnnum) { 存入Vn数据 Vn[Vnnum]=s[i].substring(0,1);// Vnnum++; } P.add(s[i]); } else { t3.setText("文法输入有误,请重新输入"); return; } } yn_null=newchar[100]; first=newchar[Vnnum][100]; intflag=0; StringfirstVn[]=null; firstComplete=newint[Vnnum]; //依次求FIRST** for(inti=0;Vn[i]! =null;i++) flag=0; t3.append("}"+"\n"); firstVn=newString[20]; flag=0; } t3.append("select集: "+"\n");//显示SELECT** for(inti=0;i { t3.append("select("+(String)P.elementAt(i)+")={"); for(intj=0;select[i][j]! ='\0';j++) { t3.append(select[i][j]+","); } t3.append("}"+"\n"); } for(inti=0;Vn[i]! =null;i++)//判断select交集是否为空 { intbiaozhi=0; charsave[]=newchar[100]; for(intj=0;j { P.elementAt(j); Stringt=(String) if(t.substring(0,1).equals(Vn[i])) for(k=0;select[j][k]! ='\0';k++) { select[j][k]; save[biaozhi]=biaozhi++; } else//当有交集时,不为LL (1)文法 { t3.append("不是LL (1)文法! ! "+"\n"); return; charVt[]=newchar[100];intbiaozhi=0; for(inti=0;i { Stringt=(String)P.elementAt(i); for(intj=2;j 入Vt —{ if(t.charAt(j)>'Z'||t.charAt(j)<'A') { if(puanduanChar(Vt,t.charAt(j))) { Vt[biaozhi]=t.charAt(j); biaozhi++; } } } } if(puanduanChar(Vt,'#'))//若可推出空集,则将#加入Vt。 { Vt[biaozhi]=biaozhi++; } 析表 shuju=newString[Vnnum][biaozhi+1]; Stringf=""; vt_tou[0]=f; for(inti=0;i { vt_tou[i+1]=String.valueOf(Vt[i]); } for(inti=0;i { shuju[i][0]=Vn[i]; } for(inti=0;i Stringt=(String)P.elementAt(i); if(Vn[j].equals(t.substring(0,1))) break; } } for(k=0;select[i][k]! ='\0';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(””); t3.setText(””); Vn=null; P=null; firstComplete=null; first=null; followComplete=null; follow=null; select=null; dtm=newDefaultTableModel(); table.setModel(dtm); t3.setText(””); if(LL==1) Strings=t2.getText(); for(inti=0;i { n[u]=zifu[i]; u++; } while(! (fenxi[ffenxi-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"); n=newchar[65]; fzifu--; ffenxi--; if(buzhou<10) n[0]=(char)('0'+buzhou);//显示步骤数 else { n[0]=(char)('0'+buzhou/10); n[1]=(char)('0'+buzhou%10); } u=14; for(inty=ffenxi-1;y>=0;y--)//处理分析栈,出栈 { n[u]=fenxi[y]; u++; } u=29; 一个字符 for(inty=fzifu-1;y>=0;y--)//处理剩余字符串,消除 { n[u]=zifu[y]; u++; } buzhou++; continue; } for(i=0;Vn[i]! =null;i++)//搜寻所用产生式的左部 { if(Vn[i].equals(String.valueOf(k)))break; } for(j=0;j { if(vt_tou[j].equals(String.valueOf(t)))break } if(j>=vt_tou.length)//全部产生式都不能符合则报错 "+"\n"); t3.append("\n"+"该串不是该文法的句型 return; Objectresult仁shuju[i][j]; if(result1==null) { "+"\n"); t3.append(String.copyValueOf(n));t3.append("\n"+"该串不是该文法的句型 return; } else//找到所用产生式 { n[49]=Vn[i].charAt(0); u=50; Stringresult=(String)result1; for(inty=0;y { n[u]=result.charAt(y); u++; } "\n"); t3.append(String.copyValueOf(n)+ n=newchar[65]; ffenxi--; //将分析栈内非 for(i=result.length()-1;i>0;i--) 终结符换为右边表达式 { if(result.charAt(i)! ='#') { fenxi[ffenxi]=result.charAt(i); ffenxi++; } } } if(buzhou<10)//显示"步骤”n[0]=(char)('O'+buzhou); else char)('0'+buzhou/10);char)('0'+buzhou%10); { n[0]=( n[1]=( else return intflag) privateintadd_First(chara[],Stringb,StringfirstVn[], //计算FIRST**(递归) {if(puanduanString(firstVn,b.charAt(O))){addString(firstVn,b);} 表达式右端第i个 first ;j++)〃所求非终 //判断能否推 ;j++) returnflag; for(inti=0;i { Stringt=(String)P.elementAt(i); for(intk=2;k { if(t.substring(0,1).equals(b)) { if(t.charAt(k)>'Z'||t.charAt(k)<'A')// 不是非终结符 { if(flag==0||puanduanChar(a,t.charAt(k))) { if(t.charAt(k)=='#')//#时直接加入 { if(k+仁=t.length()) { a[flag]=t.charAt(k); flag++; } intflag仁0; for(intj=0;yn_null[j]! ='\0' 结符进入yn_null** { if(yn_null[j]==b.charAt(0)) 出空 { flag1=1;break; } } if(flag仁=0) { intj; for(j=0;yn_null[j]! ='\0' { } yn_null[j]=b.charAt(0); continueelse//终结符直接加入first** { a[flag]=t.charAt(k); flag++; break; } }break; } else//非终结符 { if(! puanduanString(Vn,t.charAt(k))) { intp=firstComplete(t.charAt(k));//当该非终结符 的first已经求出 if(p! =-1) { flag=addElementFirst(a,p,flag);//直接加入所 求first } else if((flag=add_First(a,String.valueOf(t.charAt(k)),firstVn,flag))== -1) return-1; intflag仁0; for(intj=0;yn_null[j]! ='\0';j++)//当非终结符的 first有空 { if(yn_null[j]==t.charAt(k)) { flag1=1;break; } } if(flag仁=1)II当非终结符的first能推出空 { if(k+仁=14ngth()&&puanduanChar(a, { a[flag]= flag++; } continue #))II之后无符号,且所求first无# '#';//first中加入# ;II判断下一个字符 break else//错误 { t3.setText("文法输入有误"+"\n");return-1; } } } } } returnflag; } private int tianjiaFollow( chara[],String b,String followVn[],{ intflag) //计算FOLLOW** (递归) if(puanduanString(followVn,b.charAt(O))){addString(followVn,b);}else { returnflag; } if(b.equals("S"))//当为5时#存入follow { a[flag]='#'; flag++; } for(inti=0;i { Stringt=(String)P.elementAt(i); for(intj=2;j { if(t.charAt(j)==b.charAt(0)&&j+1 if(t.charAt(j+1)! ='\0') { 所求为终结符 if((t.charAt(j+1)> 'Z'||t.charAt(j+1)< 'A'))// if(flag==O||puanduanChar(a,t.charAt (2)))//自身 { a[flag]=t.charAt(j+1); flag++; } } elseII所求为非终
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 语法 分析器