1、实验二 LL1分析法实验二 LL(1)分析法一、实验目的 通过完成预测分析法的语法分析程序,了解预测分析法和递归子程序法的区别和联系。使学生了解语法分析的功能,掌握语法分析程序设计的原理和构造方法,训练学生掌握开发应用程序的基本方法。有利于提高学生的专业素质,为培养适应社会多方面需要的能力。二、实验内容 根据某一文法编制调试 LL ( 1 )分析程序,以便对任意输入的符号串进行分析。 构造预测分析表,并利用分析表和一个栈来实现对上述程序设计语言的分析程序。 分析法的功能是利用LL(1)控制程序根据显示栈栈顶内容、向前看符号以及LL(1)分析表,对输入符号串自上而下的分析过程。 三、 LL(1)
2、分析法实验设计思想及算法 模块结构:(1)定义部分:定义常量、变量、数据结构。(2)初始化:设立LL(1)分析表、初始化变量空间(包括堆栈、结构体、数组、临时变量等);(3)控制部分:从键盘输入一个表达式符号串;(4)利用LL(1)分析算法进行表达式处理:根据LL(1)分析表对表达式符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示错误信息。四、实验要求1、编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。2、如果遇到错误的表达式,应输出错误提示信息。 3、对下列文法,用LL(1)分析法对任意输入的符号串进行分析: (1)E-TG(2)G-+TG|TG(3)G-(4)T-F
3、S(5)S-*FS|/FS(6)S-(7)F-(E)(8)F-i输出的格式如下:五、实验步骤1、根据流程图编写出各个模块的源程序代码上机调试。2、 编制好源程序后,设计若干用例对系统进行全面的上机测试,并通过所设计的LL(1)分析程序;直至能够得到完全满意的结果。3、书写实验报告 ;实验报告正文的内容: 写出LL(1)分析法的思想及写出符合LL(1)分析法的文法。 程序结构描述:函数调用格式、参数含义、返回值描述、函数功能;函数之间的调用关系图。 详细的算法描述(程序执行流程图)。 给出软件的测试方法和测试结果。 实验总结 (设计的特点、不足、收获与体会)。六、源程序1、操作类package
4、LL1Analysis;public class LL1_Opertion private char strChar;/输入串 private char stack = new char1000;/分析栈 private int top = 0;/分析栈指针 private int strPointer = 0;/输入串指针 private int length;/输入串长度 private String analysisTable = new String69;/分析表 private final char constChar= i,(,+,-,*,/,),#;/常字符 private St
5、ring dataStrings = new String10005;/结果数据表 private String tempString = new String();/临时字符串 private String result = new String();/得出的结果字符串 private int dataRow = 0;/数据表行数 /* 规则 i ( + - * / ) #E E-TG E-TG synch synchG G-+TG G-TG G- G-T T-FS T-FS synch synch synch synchS S- S- S-*FS S-/FS S- S-F F-i F-(E
6、) synch synch synch synch synch synch */ public LL1_Opertion() /初始化各个参数 for (int i = 0; i 6; i+) for (int j = 0; j 9; j+) analysisTableij = new String(); analysisTableij = ; for (int i = 0; i 1000; i+) for (int j = 0; j 5; j+) dataStringsij = new String(); dataStringsij = ; analysisTable01 = i; anal
7、ysisTable02 = (; analysisTable03 = +; analysisTable04 = -; analysisTable05 = *; analysisTable06 = /; analysisTable07 = ); analysisTable08 = #; analysisTable10 = E; analysisTable20 = G; analysisTable30 = T; analysisTable40 = S; analysisTable50 = F; analysisTable11 = TG; analysisTable12 = TG; analysis
8、Table23 = +TG; analysisTable24 = -TG; analysisTable27 = ; analysisTable28 = ; analysisTable31 = FS; analysisTable32 = FS; analysisTable43 = ; analysisTable44 = ; analysisTable45 = *FS; analysisTable46 = /FS; analysisTable47 = ; analysisTable48 = ; analysisTable51 = i; analysisTable52 = (E); stacktop
9、 = #; stack+top = E; public boolean checkChar(char needCheck) /检查字符是否在字符表中 for (int i = 0; i constChar.length; i+) if (needCheck = constChari) return true; return false; public void printStack() /输出分析栈 this.tempString = new String(); for (int i = 0; i top+1; i+) this.tempString += stacki; System.out
10、.print(stacki); result += stacki; System.out.print(tt); result += tt; public void printStr() /输出剩余输入串 this.tempString = new String(); for (int i = 0; i strPointer; i+) System.out.print( ); result += ; for (int i = strPointer; i length; i+) this.tempString += strChari; System.out.print(strChari); res
11、ult += strChari; System.out.print(ttt); result += ttt; public void analysis(String line) /LL(1)分析 strChar = line.toCharArray(); length = strChar.length; String analysisString = new String(); char ch = strCharstrPointer; char topX; int finish = 0 , flag = 0; int row = 0 , column = 0; System.out.print
12、(步骤tt分析栈 tt剩余字符 tt所用产生式 tt动作n); result += 步骤tt分析栈 tt剩余字符 tt所用产生式 tt动作rn; dataStrings00 = dataRow+ + ; System.out.print(dataRow+tt); result += dataRow+tt; printStack(); dataStrings01 = tempString; printStr(); dataStrings02 = tempString; dataStrings04 = 初始化; result += tt初始化rn; System.out.print(n); do
13、topX = stacktop-; dataStringsdataRow0 = dataRow + ; System.out.print(dataRow+tt); result += dataRow+tt; for (int i = 0; i 9; i+) /判断是否为非终结符 if (checkChar(topX) flag = 1; break; if (flag = 1) /如果是终结符 if (topX = #) finish = 1; System.out.println(over); result += overrn; break; if (topX = ch) printStac
14、k(); dataStringsdataRow1 = tempString; ch = strChar+strPointer; printStr(); dataStringsdataRow2 = tempString; System.out.print(匹配n); dataStringsdataRow4 = GETNEXT(I); result += ttGETNEXT(I)rn; flag = 0; this.dataRow+; else printStack(); dataStringsdataRow1 = tempString; printStr(); dataStringsdataRo
15、w2 = tempString; System.out.print(错误n); result += tt错误rn; this.dataRow+; break; else for (int i = 0; i 6; i+) if (topX = analysisTablei0.charAt(0) row = i; break; for (int i = 0; i = 0; i-) stack+top = analysisString.charAt(i); printStack(); dataStringsdataRow1 = tempString; printStr(); dataStringsd
16、ataRow2 = tempString; System.out.print(analysisTablerow0+-+analysisString+n); dataStringsdataRow3 = analysisTablerow0+-+analysisString; result += analysisTablerow0+-+analysisString; if (!analysisString.equals() dataStringsdataRow4 = POP,PUSH(+analysisString+); result += ttPOP,PUSH(+analysisString+)r
17、n; else dataStringsdataRow4 = POP; result += ttPOPrn; if (stacktop = ) top-; this.dataRow+; else printStack(); dataStringsdataRow1 = tempString; printStr(); dataStringsdataRow2 = tempString; System.out.print(出错n); result += tt错误rn; this.dataRow+; break; while (finish = 0); public String getDataStrin
18、gs() return dataStrings; public void setDataStrings(String dataStrings) this.dataStrings = dataStrings; public int getDataRow() return dataRow; public void setDataRow(int dataRow) this.dataRow = dataRow; public String getResult() return result; public void setResult(String result) this.result = resu
19、lt; 2、界面类package LL1Analysis;import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.io.FileWriter;import org.eclipse.swt.widgets.Display;import org.eclipse.swt.widgets.FileDialog;import org.eclipse.swt.widgets.MessageBox;import org.eclipse.swt.widgets.Shell;import or
20、g.eclipse.swt.widgets.Menu;import org.eclipse.swt.widgets.TableItem;import org.eclipse.swt.SWT;import org.eclipse.swt.widgets.MenuItem;import org.eclipse.swt.custom.ScrolledComposite;import org.eclipse.swt.widgets.Text;import org.eclipse.swt.widgets.Table;import org.eclipse.swt.widgets.TableColumn;i
21、mport org.eclipse.swt.events.SelectionAdapter;import org.eclipse.swt.events.SelectionEvent;public class LL1SWT protected Shell shell; private Text text; private Text text_1; private Table table; private MessageBox messageBox; private File sourceFile = null; private LL1_Opertion mOpertion; private St
22、ring Language = new String(); private String analysisString = new String(); private String result = new String(); /* * Launch the application. * param args */ public static void main(String args) try LL1SWT window = new LL1SWT(); window.open(); catch (Exception e) e.printStackTrace(); /* * Open the
23、window. */ public void open() Display display = Display.getDefault(); createContents(); shell.open(); shell.layout(); while (!shell.isDisposed() if (!display.readAndDispatch() display.sleep(); /* * Create contents of the window. */ protected void createContents() shell = new Shell(); shell.setSize(5
24、70, 424); shell.setText(LL(1)u5206u6790u5668); Menu menu = new Menu(shell, SWT.BAR); shell.setMenuBar(menu); MenuItem menuItem = new MenuItem(menu, SWT.NONE); menuItem.addSelectionListener(new SelectionAdapter() Override public void widgetSelected(SelectionEvent e) try newTextTable(); catch (Excepti
25、on e2) e2.printStackTrace(); ); menuItem.setText(u65B0u5EFA); MenuItem menuItem_1 = new MenuItem(menu, SWT.NONE); menuItem_1.addSelectionListener(new SelectionAdapter() Override public void widgetSelected(SelectionEvent e) openFile(); ); menuItem_1.setText(u6253u5F00); MenuItem menuItem_3 = new MenuItem(menu, SWT.NONE); menuItem_3.addSelectionListener(new SelectionAdapter() Override public void widgetSelected(SelectionEvent e) try
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1