1、当出现终结符时,判断其与剩余输入串的第一个字符是否匹配,如果匹配,则继续分析,否则报错。LL(1)分析方法要求文法满足如下条件:对于任一非终极符A的两个不同产生式A ,A ,都要满足下面条件:SELECT(A )SELECT(A )= (2)、预测分析表构造LL(1)分析表的作用是对当前非终极符和输入符号确定应该选择用哪个产生式进行推导。它的行对应文法的非终极符,列对应终极符,表中的值有两种:一是产生式的右部的字符串,一是null。若用M表示LL(1)分析表,则M可表示如下: M: VNVT PError M(A, t) = A ,当t select(A ) ,否则 M(A, t) = Err
2、or其中P表示所有产生式的集合。(3)、语法分析程序构造LL(1)分析中X为符号栈栈顶元素,a为输入流当前字符,E为给定测试数据的开始符号,#为句子括号即输入串的括号。分析表用一个二位数组M表示,数组元素MA,a中的下标A表示非终结符,a为终结符或句子括号#,二维数组中存放的是一条关于A 的产生式,表明当非终结符A向下推导时,面临输入符a时,所采用的候选产生式,当元素内容无产生式时,则表明用A 的左部向下推导时出现了不该出现的符号,因此元素内容转向出错处理的信息。LL(1)分析过程主要包括以下四个动作:替换:当X VN时选相应产生式的右部 去替换X。此时X出栈, 逆序入栈。匹配:当X VT时它
3、与a进行匹配,其结果可能成功,也可能失败,如果成功则符号栈中将X退栈并将输入流指针向前移动一位,否则报错。接受:当格局为(#,空#)时报告分析成功。报错:出错后,停止分析。并给出相应的错误提示信息。2.程序流程图:3、实验程序(1)分析栈类:public class stack private char s; private int top; public stack() s = new char200; s0 = #; top = 0; char getTop() return stop; void push(String str) for (int i = str.length() - 1
4、; i = 0; i-) s+top = str.charAt(i); void clear() char pop() if (top != 0) top-; public String toString() String tmp = for (int i = 0; i + else stack.push(tmp); + tmp);public String work(String ts) input = ts; input = input.trim()+ symbol = true; stack.clear(); tempBuffer.append(rn步骤 分析栈 剩余输入栈 所用产生式r
5、n analyse(); if (symbol) tempBuffer.append(r是正确的符号串r return tempBuffer.toString(); else r不是正确的符号串r /gets and sets/public StringBuffer getTempBuffer() return tempBuffer;public void setTempBuffer(StringBuffer tempBuffer) this.tempBuffer = tempBuffer;public stack getStack() return stack;public void set
6、Stack(stack stack) this.stack = stack;public String getTab() return tab;public void setTab(String tab) this.tab = tab;public String getInput() return input;public void setInput(String ns) this.input = ns;public int getPtr() return ptr;public void setPtr(int ptr) this.ptr = ptr;public int getRow() re
7、turn row;public void setRow(int row) this.row = row;public int getCol() return col;public void setCol(int col) this.col = col;public int getStep() return step;public void setStep(int step) this.step = step;public boolean isBoo() return symbol;public void setBoo(boolean boo) this.symbol = boo; (3)WIN
8、DOW窗体类:import java.awt.BorderLayout;import java.awt.GridLayout;import java.awt.Panel;import javax.swing.JFrame;import javax.swing.JScrollPane;public class gui extends javax.swing.JFrame /* Creates new form gui */ private javax.swing.JButton jButton1; private javax.swing.JLabel jLabel1; private javax
9、.swing.JLabel jLabel2; private javax.swing.JTextArea jTextArea1; private javax.swing.JTextField jTextField1; private Panel p1=new Panel(); private Panel p2=new Panel(); public gui() initComponents(); private void initComponents() jLabel1 = new javax.swing.JLabel(); jTextField1 = new javax.swing.JTex
10、tField(); jLabel2 = new javax.swing.JLabel(); jTextArea1 = new javax.swing.JTextArea(20,30); jButton1 = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); jLabel1.setText(本程序只能对由,构成的以结尾的字符串进行分析。请输入要翻译的表达式: jLabel2.setText(分析结果: jButton1.setText(分析 jButton
11、1.addActionListener(new java.awt.event.ActionListener() public void actionPerformed(java.awt.event.ActionEvent evt) jButton1ActionPerformed(evt); ); final GridLayout gridLayout = new GridLayout(0, 1);/创建表格布局管理器 gridLayout.setVgap(0); /设置组件之间垂直距离 gridLayout.setHgap(0); /设置组件之间平行距离 p1.setLayout(gridLa
12、yout); p1.add(jLabel1); p1.add(jTextField1); p2.add(jLabel2); p2.add(new JScrollPane(jTextArea1); getContentPane().add(p1, BorderLayout.NORTH); getContentPane().add(p2, BorderLayout.CENTER); getContentPane().add(jButton1, BorderLayout.SOUTH); setSize(600,500); setLocation(400, 100); setVisible(true)
13、; setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) anlysis ans = new anlysis(); jTextArea1.setText(ans.work(jTextField1.getText(); public static void main(String args) java.awt.EventQueue.invokeLater(new Runnable() public void run() new gui().setVisible(true);五、实验结果 六、实验小结1、本次实验主要运用java进行实验,通过完成预测分析法的语法分析程序,了解了预测分析法和递归子程序法的区别和联系,了解了语法分析的功能;2、掌握了语法分析程序设计的原理和构造方法,掌握了开发应用程序的基本方法;3、通过实验掌握了语法分析,能实现对普通字串的分析翻译。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1