《编译原理语法分析器》由会员分享,可在线阅读,更多相关《编译原理语法分析器(31页珍藏版)》请在金锄头文库上搜索。
1、实验二 语法分析器一、实验目的通过完成预测分析法的语法分析程序,了解预测分析法和递归子程序法的区 别和联系。 使学生了解语法分析的功能, 掌握语法分析程序设计的原理和构造方 法,训练学生掌握开发应用程序的基本方法。 有利于提高学生的专业素质, 为培 养适应社会多方面需要的能力。二、实验内容根据某一文法编制调试 LL ( 1 )分析程序,以便对任意输入的符号串 进行分析。构造预测分析表,并利用分析表和一个栈来实现对上述程序设计语言的分 析程序。分析法的功能是利用 LL (1)控制程序根据显示栈栈顶内容、向前看符号 以及 LL (1)分析表,对输入符号串自上而下的分析过程。三、LL (1)分析法实
2、验设计思想及算法模块结构: (1)定义部分:定义常量、变量、数据结构。(2)初始化:设立 LL(1) 分析表、初始化变量空间(包括堆栈、结构体、数组、 临时变量等);( 3)控制部分:从键盘输入一个表达式符号串;(4)利用LL(1)分析算法进行表达式处理:根据 LL(1)分析表对表达式符号串进 行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示错误信息。刃和程序入取占入符取f入符黃弃出挨顶符号较入况LLCI)預测分析程序流程四、实验要求1、编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。2、如果遇到错误的表达式,应输出错误提示信息。3、对下列文法,用LL( 1)分析法对任意输入的
3、符号串进行分析:(1) E-TG(2) G-+TG| TG(3) G- &(4) T-FS(5) S-*FS|/FS(6) S-(7) F-(E)(8) F-i 输出的格式如下:分祈枝1口1刈oi+i+i#1+1*T*+ i*i#+ 1*1*+ i*i# x+l#E-TGT-FS F-is- HTG功作 初始化POP, PUSH (GT)POP, PVSM (SF) ror, fvsk G) GETNEXT CDDnr F i- rsrsss1*4*1*1#*r#T-PSPOPPOP, PUSH(GT) GETNEXT CO rop, FVSH P) rop,mMG)i* i#GETNEXTC
4、I) S-*FSPOP, FUSKteF*)GETHE 灯 CD F-irorrvsKG)OETNEXT CD200&-6-23五、实验源程序LLl.javaimport java.awt.*;importjava.awt.eve nt.*;importjavax.swi ng.*;importjavax.swi ng.table.DefaultTableModel;import java.sql.*;import java.util.Vector;public class LL1 exte nds JFrameimpleme ntsActio nListe ner/*privatestati
5、cfinallong serialVers ionUIDJTextFieldtf1 ;JTextFieldtf2 ;JLabell ;JButt onb0;JPanelp1 , p2 , p3 ;JTextAreat1 , t2 , t3 ;JButt onb1, b2 , b3 ;*/=1L;JLabell0 , l1 , l2 , l3 , l4 ;JTabletable ;Stateme ntsta ;Connectionconn ;ResultSetrs ;DefaultTableModeldtm ;Stri ngVn = null ;VectorP=nullintfirstCompl
6、ete=null ; /存储已判断过first的数据charfirst =null ;/存储最后first 结果intfollowComplete=null ; /存储已判断过follow的数据charfollow =null;II存储最后follow 结果charselect =null;II存储最后select 结果intLL =0; /标记是否为LL (1 )Stri ngvt_tou =null;II储存VtObjectshuju =null;II存储表达式数据charyn_n ull =null ;II存储能否推出空LL1()setLocati on (100,0); setSize
7、(700,780);tf1 =new JTextField(13);tf2 =new JTextField(13);l =new JLabel( );l0=new JLabel(输入字符串:”););l1= newJLabel(输入的文法为丿;l2= new JLabel( ););l3= newJLabel(分析的结果丿;II .l4= newJLabel(预测分析表);p仁new JPa nel();p2 = new JPa nel();p3 = new JPa nel();t1 := new JTextArea(24,20);t2 := new JTextArea(1,30);t3 :=
8、 new JTextArea(24,40);b0 = new JButton(确定(S 为开始);bl := new JButto n(”判断文法”b2 =new JButton( 输入 );b3 =new JButton( 清空 );table =new JTable();JScrollPane jp1=new JScrollPane(JScrollPane jp2=new JScrollPane(JScrollPane jp3=new JScrollPane(p2 .add(tf1 );p2 .add(l );p2 .add(tf2 );p2 .add(b0 );p2 .add(b1 );
9、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( l4 );p3 .add( new JScrollPane( table ); add( p2 , Center );add( p3 , South );b0 .addActionListener(b1 .addActionListener(b2 .addActionListener(b3 .addActionLis
10、tener( setDefaultCloseOperation(JFrame.tableDimension(660,200);setVisible(.setPreferredScrollableViewportSize(true );this ); this ); this ); this );EXIT_ON_CLOSE ) newpublic void actionPerformed(ActionEvent e) if (e.getSource()= b0)String a=tf1 .getText();String b=tf2 .getText();t1 .appe nd(a+t +b+
11、n);if (e.getSource()= bl)t3 .setText(”);int Vnnum=0,k;Vn = new String100;P=new Vector();Stri ng s=t1 .getText().split(n);for ( int i=0;is. length ;i+)if (s. length 2)判断长度是否符t3 .setText( 文法输入有误,请重新输入”);/ 合return ;if (si.charAt(O)=A &si.charAtfor (k=0;k=Vnnum)存入Vn数据VnVnn um=si.substri ng(0, 1);/Vnnu m
12、+;P.add(si);elset3 .setText( 文法输入有误,请重新输入);return ;yn_null=new char 100;first=new char Vnnum100;int flag=0;Stri ng firstV n=null ;firstComplete =new int Vnnum;for ( int i=0; Vni!= null ;i+)/ 依次求 FIRST*flag=0;if (flag=add_First(first i,Vn i,firstVn,flag)=-1)returnfirstComplete i=1;t3 .append( first 集: +n ); for ( int i=0; Vni!= null ;i+)/ 显示 FIRST*t3 .append( first(+Vni+ )= );for ( int j=0; first ij!=0 ;j+)t3 .append( first ij+II II);t3 .append( +n );fol