版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、软 件 学 院 综合训练项目报告书课程名称 编译原理 项目名称 词法分析器的设计 专业班级 组 别 成 员 任课教师 2015 年 6 月 目 录1 设计时间12 设计任务13 设计内容13.1问题分析13.1.1功能模块图13.1.2输入和输出的形式23.1.3测试数据23.2程序设计(总体设计)33.2.1程序基本算法和实现功能33.2.2主程序的流程及函数的调用关系图33.2.3主要函数伪码算法43.3测试与分析43.3.1测试53.3.2分析63.4 代码64 总结与展望12参考文献13成员分工13成绩评定131 设计时间 2015年5月 18日至2015年6月 5日2 设计任务3 设
2、计内容 综合训练二的题目二设计要求:1) 用Java语言开发一个词法分析程序,词法分析程序可以分析包含以下符号的测试代码;关键字:if、int、for、while、do、return、break、continue、sizeof, const, static、void词种别码为1。标识符;单词种别码为2。常数为无符号整形数;单词种别码为3。分隔符包括:,、;、(、); 单词种别码为4。运算符包括:+、-、*、/、=、 、<、 =、<=、!= 、+=、-=、*=、/=、%=;单词种别码为5。2) 编写的分析程序能够正确识别源程序中的单词符号; 3)
3、0;识别出的单词以<种别码,值>的形式保存在符号表中;如:<2, "main"><4, "("><4, ")"><4, ""><1, "int">4)正确设计和维护符号表;5)对于源程序中的词法错误,遇到错误时可显示“Error”,然后跳过错误部分继续显示,能够做出简单的错误处理,给出简单的错误提示,保证顺利完成整个源程序的词法分析。3.1问题分析 3.1.1功能模块图图3-1 功能模板图3.1.2输入和输出的形式输入形式:
4、用户输入一串代码;输出形式:识别出的单词以<种别码,值>的形式保存在符号表中。3.1.3测试数据测试代码1:main() 汉字 int 2a, b; 1a = 1w0; b = a + 20;#测试代码2:#include &l
5、t;stdio.h>#include <string.h>#define STR(s1, s2, s3, sum) strcat(strcat(strcat(sum, s1), s2), s3);void main()/注释char str1 = "I ", str2 = "am ", str3 = "KangKang!", str40 = ""STR(str1, str2, str3, str);/*strcat(strcat(strcat(sum, str1), str2), str3);*/
6、printf("ntstr1 = %sntstr2 = %sntstr3 = %sntstr = %snnn", str1, str2, str3, str); 3.2程序设计(总体设计)3.2.1程序基本算法和实现功能 除了利用循环数组和字符串下标和截取字符串等基本方法来实现外,还有以下类的使用。见表3-1类和方法说明表所示。表3-1 类和方法说明表类名/方法名类的功能说明compiler主程序调用类cifa主程序类computerComp 主程序加工类isLetter判断读取的字符是否是字母isMath判断读取的字符是否是数字isJieFu判断读取的字符是否是分隔符。i
7、sCompu判断读取的字符是否是运算符isKeyword判断截取的字符串是否是关键字isU判断读取的字符是否是#3.2.2主程序的流程及函数的调用关系图图 3-2 程序模块的调用关系图3.2.3主要函数伪码算法 主函数伪码如下:导入程序所需包;public class ciFa extends JFrame 相应变量声明; public ciFa() 定义GUI界面大小; public ciFa() Public void actionPerformed(ActionEvent e) 调用compiler里的computerComp()方法; public class compiler pub
8、lic String computerComp(String str) 判断字符串相应的字符类别; public boolean isKeyword(String str) 判断是不是关键字; public boolean isLetter(char charr) 判断是不是字母; public boolean isMath(char charr) 判断是不是数字; public boolean isJieFu(char charr) 判断是不是分隔符; public boolean isCompu(char charr) 判断是不是运算符; public boolean isU(char c
9、harr) 判断是不是#; 3.3测试与分析3.3.1测试1. 测试用例,根据题目得到的测试用例main() 汉字 int 2a,b;1a = 1w0;b = a+20;#运行结果:图3-3用例1的运行结果2. #include <stdio.h>#include <string.h>#defineSTR(s1,s2,s3,sum)strcat(stract(stract(sum,s1),s2),s3);void main()/注释char str1="I",char str="am",char str3="Kangka
10、ng!",char str40=""STR(str1,str2,str3,str);/*strcat(stract(stract(sum,str1),str2),str3);*/printf("ntstr1=%sntstr2=%sntstr3=%sntstr=%snnn",str1,str2,str3,str);运行结果:图3-3用例2的运行结果3.3.2分析在实验过程中由于自己对专业知识掌握不够透彻,思路不够清晰,造成很多问题,主要表现在:对于符号表的设计不太理解,数据结构里的算法应用不到位。对相应的时间负责度还空间复杂度不能最简化。用户通过
11、输入一串代码,将这串代码转化为一个字符串,然后传递给compiler这个类来加工处理,整个加工流程是这样的:先将字符串的每个字符都读取出来,然后调用isletter()等方法方法来判断该字符是什么。但是利用这种方法导致程序非常的繁琐冗杂。有待提高提高程序的健壮性。3.4 代码import javax.swing.*;import javax.swing.border.TitledBorder;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;public class
12、ciFa extends JFrameprivate JButton jbtShow = new JButton("进行词法分析");private JTextArea jta = new JTextArea();private JTextArea jtaOut = new JTextArea();private JPanel jpl=new JPanel();private String intput =""private String output =""private compiler comp = new compiler()
13、;public static void main(String args)ciFa frame = new ciFa();frame.setTitle("软件12-6班 第2组 胡同敏 词法分析器");frame.setLocationRelativeTo(null);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(600, 700);frame.setVisible(true);public ciFa()jta.setWrapStyleWord(true);jta.setLineWrap
14、(true);jtaOut.setWrapStyleWord(true);jtaOut.setLineWrap(true);jtaOut.setEditable(true);JScrollPane scrollPane = new JScrollPane(jta);JScrollPane scrollPane2 = new JScrollPane(jtaOut);scrollPane.setPreferredSize(new Dimension(300,300);scrollPane2.setPreferredSize(new Dimension(300,300);String str = &
15、quot;<html><body>单词种别码对照如下:<br>#的种别码为:0<br>关键字的种别码为:1<br>标识符的种别码为:2<br>常数的种别码为:3<br>分隔符的种别码为:4<br>运算符的种别码为:5</body></html>"JLabel label = new JLabel(str);jpl.add(label);jtaOut.setBorder(new TitledBorder("词法分析的结果");jta.setBord
16、er(new TitledBorder("请您在此输入");jpl.setLayout(new GridLayout(1,2);jpl.add(jta);jpl.add(jtaOut);add(jbtShow,BorderLayout.NORTH);add(jpl);jbtShow.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)intput = jta.getText();output=puterComp(intput);jtaOut.setText(outpu
17、t);public class compiler public String computerComp(String str) String output = ""int index = 0;while (index < str.length() if (str.charAt(index) = ' ' | str.charAt(index) = 't'| str.charAt(index) = 'r' | str.charAt(index) = 'n') index+;continue;/ 判断界符if
18、(isJieFu(str.charAt(index) output += ("(5," + str.charAt(index) + ")");index+;output += ("n");else if (isU(str.charAt(index) output += ("(0," + str.charAt(index) + ")");index+;output += ("n");/ 判断运算符else if (isCompu(str.charAt(index) if (!i
19、sCompu(str.charAt(index + 1) output += ("(5,"); else if (!isCompu(str.charAt(index + 2)&& isCompu(str.charAt(index + 1) if (str.charAt(index) = '!') if (str.charAt(index + 1) = '=') output += ("(5,");output += ("n"); else output += ("(Error!
20、,");output += ("n"); else if (str.charAt(index) = '>' | str.charAt(index) = '<')| (str.charAt(index) = '*' | str.charAt(index) = '/') | (str.charAt(index) = '%' | str.charAt(index) = '=') if (str.charAt(index + 1) = '=') ou
21、tput += ("(5,");/output += ("n"); else output += ("(Error!,");/output += ("n"); else if (str.charAt(index) = '+'| str.charAt(index) = '-') if (str.charAt(index) = str.charAt(index + 1)| str.charAt(index + 1) = '=') output += ("(5,&
22、quot;);output += ("n"); else output += ("(Error!,");/output += ("n"); else output += ("(Error!,");output += ("n"); else output += ("(Error!,");output += ("n");while (isCompu(str.charAt(index) output += (str.charAt(index);index+;if
23、 (index >= str.length()return output;output += (")");output += ("n");/判断数字else if (isMath(str.charAt(index) int index1 = index;output += ("(3,");while (isMath(str.charAt(index) output += (str.charAt(index);index+;if (index >= str.length()return output;if (isLetter
24、(str.charAt(index) while (!isMath(str.charAt(index)&& (isLetter(str.charAt(index) output += (str.charAt(index);index+;if (index >= str.length()return output;output += ("是Error!)");output += ("n"); else if (str.charAt(index1) = '0') if (isMath(str.charAt(index1
25、+ 1) output += ("是Error!)");output += ("n"); else output += (")"); elseoutput += (")");output += ("n");/ 字母判断else if (isLetter(str.charAt(index) int i = index;while (isLetter(str.charAt(index) | isMath(str.charAt(index) if (index >= str.length()re
26、turn output;index+;String sub = str.substring(i, index);/ 判断是是不是关键字if (isKeyword(sub)output += ("(1," + sub + ")");elseoutput += ("(2," + sub + ")"); output += ("n");/ 空格或者回车处理else output += ("Error!");output += ("n");index+;retur
27、n output;public boolean isKeyword(String str) / 判断是不是关键字的方法boolean flag = true;String arr = "public", "static", "void", "main", "String", "int","boolean", "private", "if", "else", "while" ;f
28、or (int i = 0; i < arr.length; i+) if (str.equals(arri) flag = true;break; elseflag = false;return flag;public boolean isLetter(char charr) / 判断是不是字母的方法if (charr >= 'a' && charr <= 'z') | (charr >= 'A' && charr <= 'Z')| charr = '_
29、9;)return true;elsereturn false;public boolean isMath(char charr) / 判断是不是数字的方法if (charr >= '0') && (charr <= '9')return true;elsereturn false;public boolean isJieFu(char charr) char arr = '(', ')', '', '', '', '', '', '"',',' ;for (int i = 0; i < arr.length; i+) if (charr = arri) return true;return false; publ
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论