第一篇:編譯原理 語法分析器 (java完美運行版)
實驗二
語法分析器
一、實驗?zāi)康?/p>
通過完成預(yù)測分析法的語法分析程序,了解預(yù)測分析法和遞歸子程序法的區(qū)別和聯(lián)系。使學(xué)生了解語法分析的功能,掌握語法分析程序設(shè)計的原理和構(gòu)造方法,訓(xùn)練學(xué)生掌握開發(fā)應(yīng)用程序的基本方法。有利于提高學(xué)生的專業(yè)素質(zhì),為培養(yǎng)適應(yīng)社會多方面需要的能力。
二、實驗內(nèi)容
? 根據(jù)某一文法編制調(diào)試 LL(1)分析程序,以便對任意輸入的符號串進行分析。
? 構(gòu)造預(yù)測分析表,并利用分析表和一個棧來實現(xiàn)對上述程序設(shè)計語言的分析程序。
? 分析法的功能是利用LL(1)控制程序根據(jù)顯示棧棧頂內(nèi)容、向前看符號以及LL(1)分析表,對輸入符號串自上而下的分析過程。
三、LL(1)分析法實驗設(shè)計思想及算法
? 模塊結(jié)構(gòu):
(1)定義部分:定義常量、變量、數(shù)據(jù)結(jié)構(gòu)。
(2)初始化:設(shè)立LL(1)分析表、初始化變量空間(包括堆棧、結(jié)構(gòu)體、數(shù)組、臨時變量等);
(3)控制部分:從鍵盤輸入一個表達式符號串;
(4)利用LL(1)分析算法進行表達式處理:根據(jù)LL(1)分析表對表達式符號串進行堆棧(或其他)操作,輸出分析結(jié)果,如果遇到錯誤則顯示錯誤信息。
四、實驗要求
1、編程時注意編程風(fēng)格:空行的使用、注釋的使用、縮進的使用等。
2、如果遇到錯誤的表達式,應(yīng)輸出錯誤提示信息。
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 輸出的格式如下:
五、實驗源程序
LL1.java import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.table.DefaultTableModel;import java.sql.*;import java.util.Vector;public class LL1 extends JFrame implements ActionListener { /**
*
*/
private static final long serialVersionUID = 1L;JTextField tf1;JTextField tf2;JLabel l;JButton b0;JPanel p1,p2,p3;JTextArea t1,t2,t3;JButton b1,b2,b3;JLabel l0,l1,l2,l3,l4;JTable table;Statement sta;Connection conn;ResultSet rs;DefaultTableModel dtm;String Vn[]=null;Vector
int firstComplete[]=null;//存儲已判斷過first的數(shù)據(jù)
char first[][]=null;//存儲最后first結(jié)果
int followComplete[]=null;//存儲已判斷過follow的數(shù)據(jù)
char follow[][]=null;//存儲最后follow結(jié)果
char select[][]=null;//存儲最后select結(jié)果
int LL=0;//標(biāo)記是否為LL(1)String vt_tou[]=null;//儲存Vt
Object shuju[][]=null;//存儲表達式數(shù)據(jù)
char yn_null[]=null;//存儲能否推出空
LL1(){ setLocation(100,0);setSize(700,780);tf1=new JTextField(13);tf2=new JTextField(13);l=new JLabel(“>>”);l0=new JLabel(“輸入字符串:”);l1=new JLabel(“輸入的文
法”);l2=new JLabel(“ ”);l3=new JLabel(“
分
析的結(jié)”);l4=new JLabel(“預(yù)測
分
析”);//p1=new JPanel();
p2=new JPanel();p3=new JPanel();t1=new JTextArea(24,20);t2=new JTextArea(1,30);t3=new JTextArea(24,40);b0=new JButton(“確定(S為開始)”);b1=new JButton(“ 判斷文法 ”);
為
:果:表
:
b2=new JButton(“輸入”);b3=new JButton(“清空”);table=new JTable();JScrollPane jp1=new JScrollPane(t1);JScrollPane jp2=new JScrollPane(t2);JScrollPane jp3=new JScrollPane(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(new JScrollPane(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(new Dimension(660,200));setVisible(true);} public void actionPerformed(ActionEvent e){ if(e.getSource()==b0){ String a=tf1.getText();String b=tf2.getText();t1.append(a+'→'+b+'n');}
if(e.getSource()==b1){ t3.setText(“");int Vnnum=0,k;Vn=new String[100];P=new Vector return;} if(s[i].charAt(0)<='Z'&&s[i].charAt(0)>='A'&&s[i].charAt(1)=='→'){ for(k=0;k if((flag=add_First(first[i],Vn[i],firstVn,flag))==-1)return;firstComplete[i]=1;} t3.append(”first集:“+”n“);//顯示FIRST** for(int i=0;Vn[i]!=null;i++){ t3.append(”first(“+Vn[i]+”)={ “);for(int j=0;first[i][j]!='