版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验一 词法分析设计一、实验目的通过本实验的编程实践,使学生了解词法分析的任务,掌握词法分析程序设计的原理和构造方法,使学生对编译的基本概念、原理和方法有完整的和清楚的理解,并能正确地、熟练地运用。二、实验内容用VC+/VB/JAVA语言实现对C语言子集的源程序进行词法分析。通过输入源程序从左到右对字符串进行扫描和分解,依次输出各个单词的内部编码及单词符号自身值;若遇到错误则显示“Error”,然后跳过错误部分继续显示 ;同时进行标识符登记符号表的管理。以下是实现词法分析设计的主要工作:(1)从源程序文件中读入字符。(2)统计行数和列数用于错误单词的定位。(3)删除空格类字符,包括回车、制表符
2、空格。(4)按拼写单词,并用(内码,属性)二元式表示。(属性值token的机内表示)(5)如果发现错误则报告出错(6)根据需要是否填写标识符表供以后各阶段使用。单词的基本分类:u 关键字:由程序语言定义的具有固定意义的标识符。也称为保留字例如 if、 for、while、printf ; 单词种别码为1。u 标识符:用以表示各种名字,如变量名、数组名、函数名;u 常数: 任何数值常数。如 125, 1,0.5,3.1416;u 运算符:+、-、*、/;u 关系运算符: <、<=、= 、>、>=、<>;u 分界符: ;、,、(、)、;三、词法分析实验设计思想及
3、算法 1、主程序设计考虑:u 程序的说明部分为各种表格和变量安排空间。在具体实现时,将各类单词设计成结构和长度均相同的形式,较短的关键字后面补空。 k数组-关键字表,每个数组元素存放一个关键字(事先构造好关键字表)。s 数组-存放分界符表(可事先构造好分界符表)。为了简单起见,分界符、算术运算符和关系运算符都放在s表中(编程时,应建立算术运算符表和关系运算符表,并且各有类号),合并成一类。 id 和ci 数组分别存放标识符和常数。 instring 数组为输入源程序的单词缓存。 outtoken 记录为输出内部表示缓存。 还有一些为造表填表设置的变量。 u 主程序开始后,先以人工方式输入关键字
4、,造k表;再输入分界符等造 p 表。 u 主程序的工作部分设计成便于调试的循环结构。每个循环处理一个单词;接收键盘上送来的一个单词;调用词法分析过程;输出每个单词的内部码。例如,把每一单词设计成如下形式: (type,pointer)其中type指明单词的种类,例如:Pointer指向本单词存放处的开始位置。还有一些为造表填表设置的变量。 u 主程序开始后,先以人工方式输入关键字,造k表;再输入分界符等造 p 表。 u 主程序的工作部分设计成便于调试的循环结构。每个循环处理一个单词;接收键盘上送来的一个单词;调用词法分析过程;输出每个单词的内部码。例如,把每一单词设计成如下形式: (type,
5、pointer)其中type指明单词的种类,例如:Pointer指向本单词存放处的开始位置。词法分析设计流程图2、词法分析过程考虑 u 根据输入单词的第一个字符(有时还需读第二个字符),判断单词类,产生类号:以字符k表示关键字;id表示标识符;ci表示常数;s 表示分界符。 u 对于标识符和常数,需分别与标识符表和常数表中已登记的元素相比较,如表中已有该元素,则记录其在表中的位置,如未出现过,将标识符按顺序填入数组 id 中,将常数变为二进制形式存入数组中 ci 中,并记录其在表中的位置。lexical 过程中嵌有两个小过程:一个名为 getchar,其功能为从 instring 中按顺序取出
6、一个字符,并将其指针 pint 加 1 ;另一个名为 error,当出现错误时,调用这个过程,输出错误编号。u 要求:所有识别出的单词都用两个字节的等长表示,称为内部码。第一个字节为 t ,第二个字节为 i 。 t 为单词的种类。关键字的 t=;分界符的 t=;算术运算符的 t=;关系运算符的 t=;无符号数的 t=;标识符的 t=。i 为该单词在各自表中的指针或内部码值。表 1 为关键字表;表 2 为分界符表;表 3 为算术运算符的 i 值;表 4 为关系运算符的 i 值。 取字符和统计字符行列位置子程序四、实验要求1、编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。2、将标识符填
7、写的相应符号表须提供给编译程序的以后各阶段使用。3、根据测试数据进行测试。测试实例应包括以下三个部分:u 全部合法的输入。u 各种组合的非法输入。u 由记号组成的句子。4、词法分析程序设计要求输出形式:例:输入VC+语言的实例程序:If i=0 then n+;a= 3b %);输出形式为:单词 二元序列 类 型 位置(行,列) (单词种别,单词属性)for (1,for ) 关键字 (1,1) i ( 6,i ) 标识符 (1,2)= ( 4,= ) 关系运算符 (1,3)0 ( 5,0 ) 常数 (1,4)then ( 1,then) 关键字 (1,5)n (6,n ) 标识符 (1,6)
8、+ Error Error (1,7); ( 2, ; ) 分界符 (1,8)a (6,a ) 标识符 (2,1)= (4,<= ) 关系运算符 (2,2)3b Error Error (2,4)% Error Error (2,4)) ( 2, ) ) 分界符 (2,5); ( 2, ; ) 分界符 (2,6)五、实验步骤1、根据流程图编写出各个模块的源程序代码上机调试。2、 编制好源程序后,设计若干用例对系统进行全面的上机测试,并通过所设计的词法分析程序;直至能够得到完全满意的结果。六、程序源代码1、词法分析器操作类package 词法分析器;public class compile
9、r public String computerComp(String str) String output="" int index=0; while(index<str.length()/判断界符 if(isJieFu(str.charAt(index) output+=("(界符,"+str.charAt(index)+")"); index+; /判断运算符 else if(isCompu(str.charAt(index)if(!isCompu(str.charAt(index+1)output+=("(运算
10、符,"); elseif(!isCompu(str.charAt(index+2) && isCompu(str.charAt(index+1)if(str.charAt(index)='!')if(str.charAt(index+1)='=')output+=("(运算符,");elseoutput+=("(非法字符,");elseif(str.charAt(index)='>'|str.charAt(index)='<') | (str.charA
11、t(index)='*'|str.charAt(index)='/') | (str.charAt(index)='%'|str.charAt(index)='=')if(str.charAt(index+1)='=') output+=("(运算符,"); elseoutput+=("(非法字符,");elseif(str.charAt(index)='+'|str.charAt(index)='-')if(str.charAt(index)
12、=str.charAt(index+1) | str.charAt(index+1)='=')output+=("(运算符,");elseoutput+=("(非法字符,");elseoutput+=("(非法字符,");elseoutput+=("(非法字符,");while(isCompu(str.charAt(index) output+=(str.charAt(index); index+; if(index>=str.length() return output;output+=(&
13、quot;)");/数字 else if(isMath(str.charAt(index)int index1=index; output+=("("); while(isMath(str.charAt(index)output+=(str.charAt(index); index+; if(index>=str.length() return output; if(isLetter(str.charAt(index)while(!isMath(str.charAt(index) && (isLetter(str.charAt(index)
14、output+=(str.charAt(index);index+; if(index>=str.length() return output;output+=(",非法字符)");elseif(str.charAt(index1)='0')if(isMath(str.charAt(index1+1)output+=(",非法字符)");elseoutput+=(",数字,)");elseoutput+=(",数字,)");/字母判断 else if(isLetter(str.charAt(i
15、ndex) int i=index;while(isLetter(str.charAt(index)|isMath(str.charAt(index)if(index>=str.length() return output; index+;String sub =str.substring(i, index);/判断是是不是关键字 if(isKeyword(sub) output+=("(关键字,"+sub+")"); else output+=("(标识符,"+sub+")");/空格或者回车处理 else
16、 index+; return output;/判断是不是关键字 public boolean isKeyword(String str) boolean flag=true; String arr="public","static","void","main","String","int","boolean","private","if","else","while" ;fo
17、r(int i=0;i<arr.length;i+)if(str.equals(arri)flag=true; break; else flag=false; return flag;/判断是不是字母public boolean isLetter(char charr)if(charr>='a'&&charr<='z')|(charr>='A'&&charr<='Z') | charr='_') return true; else return fals
18、e;public boolean isMath(char charr) if(charr>='0')&&(charr<='9') return true; else return false; /判断是不是界符得方法 public boolean isJieFu(char charr) char arr='','','','','','"' for(int i=0;i<arr.length;i+) if (charr=arr
19、i) return true; return false; /判断是不是运算符得方法public boolean isCompu(char charr) boolean flag=false; char arr='=','+','-','*','!','/','<','>','%' for(int i=0;i<arr.length;i+) if (charr=arri) flag=true; break; else flag=fals
20、e; return flag; 2、 界面类package 词法分析器;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.*;import javax.swing.border.TitledBorder;public class ciFa extends JFrame private JButton jbtShow = new JButton("进行词法分析"); private JTextArea jta =
21、 new JTextArea();private JTextArea jtaOut = new JTextArea(); private JPanel jpl=new JPanel(); private String intput ="" private String output ="" private compiler comp = new compiler(); public static void main(String args) / TODO 自动生成的方法存根ciFa frame = new ciFa(); frame.setTitle(&
22、quot;词法分析器"); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(600, 400); frame.setVisible(true); public ciFa()jta.setWrapStyleWord(true); jta.setLineWrap(true); jtaOut.setWrapStyleWord(true); jtaOut.setLineWrap(true); jtaOut.setEditable(fal
23、se); JScrollPane scrollPane = new JScrollPane(jta); JScrollPane scrollPane2 = new JScrollPane(jtaOut); scrollPane.setPreferredSize(new Dimension(300,300); scrollPane2.setPreferredSize(new Dimension(300,300); jtaOut.setBorder(new TitledBorder("词法分析结果"); jta.setBorder(new TitledBorder("
24、请在这输入"); jpl.setLayout(new GridLayout(1,2); jpl.add(jta); jpl.add(jtaOut); add(jbtShow,BorderLayout.SOUTH); add(jpl);jbtShow.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e)intput = jta.getText(); output=puterComp(intput); jtaOut.append(output););七、运行结果八、实验总结由于关
25、键字表、关系运算符表、算术运算符表都是内部代码添加的,没有实现让用户自己添加的功能,本程序还只能分析*.c和*.java文件,而且没有区分大小写的功能。但由于代码比较灵活可以比较方便的修改,并添加想要的功能。 通过此次实验,我对词法分析器的运行步骤、组织结构有了更深层次的了解,熟练掌握了词法分析程序设计的原理和构造方法。实验二 LL(1)分析法一、实验目的 通过完成预测分析法的语法分析程序,了解预测分析法和递归子程序法的区别和联系。使学生了解语法分析的功能,掌握语法分析程序设计的原理和构造方法,训练学生掌握开发应用程序的基本方法。有利于提高学生的专业素质,为培养适应社会多方面需要的能力。二、实
26、验内容u 根据某一文法编制调试 LL ( 1 )分析程序,以便对任意输入的符号串进行分析。u 构造预测分析表,并利用分析表和一个栈来实现对上述程序设计语言的分析程序。u 分析法的功能是利用LL(1)控制程序根据显示栈栈顶内容、向前看符号以及LL(1)分析表,对输入符号串自上而下的分析过程。 三、 LL(1)分析法实验设计思想及算法u 模块结构:(1)定义部分:定义常量、变量、数据结构。(2)初始化:设立LL(1)分析表、初始化变量空间(包括堆栈、结构体、数组、临时变量等);(3)控制部分:从键盘输入一个表达式符号串;(4)利用LL(1)分析算法进行表达式处理:根据LL(1)分析表对表达式符号串
27、进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示错误信息。四、实验要求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输出的格式如下:五、实验步骤1、根据流程图编写出各个模块的源程序代码上机调试。2、 编制好源程序后,设计若干用例对系统进行全面的上机测试,并通过所设计的LL(1)
28、分析程序;直至能够得到完全满意的结果。六、程序源代码1、操作类package test2;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
29、 = 'i', '(', '+', '-', '*', '/', ')', '#' ;/ 常字符private String dataStrings = new String10005;/ 结果数据表private String tempString = new String();/ 临时字符串private String result = new String();/ 得出的结果字符串private int dataRow = 0;/ 数据表行数/* * 规则 i
30、( + - * / ) # E E->TG E->TG synch synch G G->+TG G->-TG G-> G-> T * T->FS T->FS synch synch synch synch S S-> S-> S->*FS S->/FS S-> S-> F * F->i F->(E) synch synch synch synch synch synch */public LL1_Opertion() / 初始化各个参数for (int i = 0; i < 6; i+) f
31、or (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"analysisTable02 = "("analysisTable03 = "+&q
32、uot;analysisTable04 = "-"analysisTable05 = "*"analysisTable06 = "/"analysisTable07 = ")"analysisTable08 = "#"analysisTable10 = "E"analysisTable20 = "G"analysisTable30 = "T"analysisTable40 = "S"analysisTable50 =
33、 "F"analysisTable11 = "TG"analysisTable12 = "TG"analysisTable23 = "+TG"analysisTable24 = "-TG"analysisTable27 = ""analysisTable28 = ""analysisTable31 = "FS"analysisTable32 = "FS"analysisTable43 = ""an
34、alysisTable44 = ""analysisTable45 = "*FS"analysisTable46 = "/FS"analysisTable47 = ""analysisTable48 = ""analysisTable51 = "i"analysisTable52 = "(E)"stacktop = '#'stack+top = 'E'public boolean checkChar(char needChe
35、ck) / 检查字符是否在字符表中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.print(stacki);result += stacki;System.out.print(&
36、quot;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);resul
37、t += 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.
38、out.print("步骤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;dat
39、aStrings04 = "初始化"result += " tt初始化rn"System.out.print("n");do topX = stacktop-;dataStringsdataRow0 = dataRow + ""System.out.print(dataRow + "tt");result += dataRow + "tt"for (int i = 0; i < 9; i+) / 判断是否为非终结符if (checkChar(topX) flag = 1
40、;break;if (flag = 1) / 如果是终结符if (topX = '#') finish = 1;System.out.println("over");result += "overrn"break;if (topX = ch) printStack();dataStringsdataRow1 = tempString;ch = strChar+strPointer;printStr();dataStringsdataRow2 = tempString;System.out.print("匹配n");da
41、taStringsdataRow4 = "GETNEXT(I)"result += " ttGETNEXT(I)rn"flag = 0;this.dataRow+; else printStack();dataStringsdataRow1 = tempString;printStr();dataStringsdataRow2 = tempString;System.out.print("错误n");result += " tt错误rn"this.dataRow+;break; else for (int i =
42、0; i < 6; i+) if (topX = analysisTablei0.charAt(0) row = i;break;for (int i = 0; i < 9; i+) if (ch = analysisTable0i.charAt(0) column = i;break;analysisString = analysisTablerowcolumn;if (!analysisString.equals(" ") if (!analysisString.equals("") for (int i = analysisString
43、.length() - 1; i >= 0; i-) stack+top = analysisString.charAt(i);printStack();dataStringsdataRow1 = tempString;printStr();dataStringsdataRow2 = tempString;System.out.print(analysisTablerow0 + "->"+ analysisString + "n");dataStringsdataRow3 = analysisTablerow0 + "->&q
44、uot;+ analysisString;result += analysisTablerow0 + "->" + analysisString;if (!analysisString.equals("") dataStringsdataRow4 = "POP,PUSH(" + analysisString+ ")"result += "ttPOP,PUSH(" + analysisString + ")rn" else dataStringsdataRow4 = &q
45、uot;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 Strin
46、g getDataStrings() 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.resu
47、lt = result;2、界面类package test2;import java.io.BufferedReader;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 String Language = new String();private
48、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 window. */public void open() Display disp
49、lay = 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(570, 565);shell.setText("LL(1)u5206u6790u5668
50、");Menu menu = new Menu(shell, SWT.BAR);shell.setMenuBar(menu);MenuItem menuItem = new MenuItem(menu, SWT.NONE);menuItem.addSelectionListener(new SelectionAdapter() Overridepublic void widgetSelected(SelectionEvent e) try newTextTable(); catch (Exception e2) e2.printStackTrace(););menuItem.setText("u65B0u5EFA");MenuItem menuItem_1 = new MenuItem(menu, SWT.NONE);menuItem_1.addSelectionListener(new SelectionAdapter() Overridepublic void widgetSelected(SelectionEvent e) openFile(););menuItem_1.setText("u6253u
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论