1、合肥工业大学编译原理实验宣城校区实 验 报 告课 程 名 称 编译原理 专 业 班 级 计算机0001班 学生姓名及学号 赵保飞 2015216768 指 导 教 师 李芒宏 实 验 地 点 计算机中心楼第四机房 2017 2018 学年第 一 学期编译原理课程实验报告实验名称词法分析设计姓 名赵保飞系院专业计算机科学与技术班级计算机01班学号2015216768实验日期2017.10.18指导教师李芒宏成绩一、实验目的和要求通过本实验的编程实践,使学生了解词法分析的任务,掌握词法分析程序设计的原理和构造方法,使学生对编译的基本概念、原理和方法有完整的和清楚的理解,并能正确地、熟练地运用。二、
2、实验原理(1)实验数据结构说明 KString数组-关键字表;schar数组分界符;mchar数组算术运算符;rString数组关系运算符;ArrayList型String数组ci常数;ArrayList型String数组id标识符(2)实验算法描述(3)算法流程图三、源程序代码和测试结果package lexicalAnalysis;import java.util.*;import java.io.*;public class lexicalAnalysis static String k=for,main,if,while,void,public,static,printf,scanf,
3、asm,do,return,typedef,auto,double,break,short,using,default,long;/关键字 static char s=,;,(,),;/2分界符 static char m=+,-,*,/;/3算术运算符 static String r=,=,;/4关系运算符 ArrayList ci=new ArrayList();/5常数 ArrayList id=new ArrayList();/6标识符 String tempToken=;/临时存放组成一个“词”单位串 int pint ,row = 1,line = 1;/当前指针指示,行数,列数
4、char ch;/存放最新读入源程序字符 String instring;/存放输入de源程序代码 public static void main(String args)throws Exception / TODO Auto-generated method stub lexicalAnalysis one = new lexicalAnalysis(); System.out.println(单词+t二元序列+t类 型+t位置(行,列)); one.readtext(); boolean isdigit(char c)/判断所读字符是否为数字,是则返回ture,否则返回false if(
5、c=48 & c64&c96&c)/当其后的字符是=或时,要再读一个字符。否则不要再读。 return true; else return false; void clearBlank()/检查空白直到读入字符非空白 while(ch= ) getchar(); void getchar() pint+; if(pint = instring.length()-1) ch=instring.charAt(pint); if(ch = n) change_row_line(); getchar(); else ch= ;/instring数据读取完,需重新读入 void retract()/读入
6、前一个字符 pint-; ch=instring.charAt(pint); void distinguishLeter()/识别字符串 tempToken=;/清空 while(isletter(ch) | isdigit(ch) | isline(ch)/字母,数字,下划线仍是字符串合法组成,继续识别 tempToken=tempToken + ch; getchar(); void distinguishDigit()/识别数字串 tempToken=;/先将strtoken置空 while(isdigit(ch)/当数字时继续识别数字串 tempToken=tempToken+ch;/
7、将新识别的字符加到strtoken后 getchar(); if(isletter(ch)|isline(ch)/识别完数字串而其后是字母,下划线时出错处理 while(isletter(ch)|isline(ch)|isdigit(ch)/当是字母,数字,下划线时继续识别错误数字串 tempToken=tempToken+ch;/将新识别的字符加到strtoken后 getchar(); display(0,tempToken, );/输出错误数字串 tempToken=;/将strtoken置空返回 void display(int i,String s,char a)/各种输出处理 sw
8、itch(i) case -1:System.out.println(a+tError+tError+t+row+,+line+); break; case 0:System.out.println(s+tError+tError+t(+row+,+line+); break; case 1:System.out.println(s+t(1,+s+)+t关键字 +t(+row+,+line+); break; case 2:System.out.println(a+t(2,+a+)+t分界符+t(+row+,+line+); break; case 3:System.out.println(a
9、+t(3,+a+)+t算术运算符+t(+row+,+line+); break; case 4:System.out.println(s+t(4,+s+)+t关系运算符 +t(+row+,+line+); break; case 5:System.out.println(s+t(5,+s+)+t常数+t+(+row+,+line+); break; case 6:System.out.println(s+t(6,+s+)+t标识符+t(+row+,+line+); break; line+;/列数加一 void change_row_line()/改变行数和列数 row+; line=1; v
10、oid handleString()/输入串处理 pint=-1;/将搜索指示器置-1 System.out.println(要处理的语句为 : +instring); getchar();/读入一个字符 while(pintinstring.length()/当搜索指示器没有越界时 clearBlank();/检查空白直到读入读入非空 if(isdigit(ch)/当ch为数字时进行数字串识别 distinguishDigit();/数字串识别 if(tempToken.length()!=0)/经过数字串识别后,如果strtoken不为空 if(reseverci(tempToken)=-
11、1)/如果strtoken不在ci表中,将strtoken加入ci表中 ci.add(tempToken);/将strtoken加入ci表中 display(5,tempToken, );/输出数字串 else /如果strtoken在ci表中,仅输出 display(5,tempToken, );/输出数字串 else if(isletter(ch)/当ch为字母时进行字符串识别 distinguishLeter();/字符串识别 if(reserve(tempToken)=-1)/如果strtoken不在k表中 if(reseverid(tempToken)=-1)/如果strtoken不
12、在id表中 id.add(tempToken);/将strtoken加入id表中 display(6,tempToken, );/输出标识串 else /如果strtoken在id表中 display(6,tempToken, );/输出标识串 else /如果strtoken在关键字表 display(1,tempToken, );/输出关键字 else if(in_s(ch)!=-1)/分界符处理包含在one.in_s(one.ch)中 else if(in_m(ch)!=-1)/算术运算符处理包含在one.in_m(one.ch)中 else if(in_k(ch)!=-1)/关系运算符
13、处理包含在one.in_k(one.ch)中 else display(-1, ,ch);/error getchar();/读下一位 int reserve(String s)/判断字符串是否是保留字 int i; for(i=0;ik.length;i+) if(s.equals(ki) return i;/是保留字,就返回编码 return -1;/不是保留字,就返回-1 int reseverid(String s)/判断识别的标志符是否已经在id表中 int i; for(i=0;iid.size();i+) if(s.equals(id.get(i) return i;/识别的标志
14、符已经在id表中,返回位置 return -1;/识别的标志符不在id表中,返回-1 int reseverci(String s)/判断识别的数字串是否已经在ci表中 int i; for(i=0;ici.size();i+) if(s.equals(ci.get(i) return i;/识别的数字串已经在ci表中,返回位置 return -1;/识别的数字串不在ci表中,返回-1 int in_s(char c)/确认分界符 int i; for(i=0;is.length;i+) if(c=si)/与某个分界符配备时 display(2, ,c);/输出分界符 getchar();/读
15、下一位 return i;/返回所在位置 return -1;/不在分界符表中 int in_m(char c)/查找算术运算符 int i; for(i=0;im.length;i+) if(c=mi)/与某个算术运算符配备时 display(3, ,c);/输出算术运算符 getchar();/读下一位 return i;/返回所在位置 return -1;/不在算术运算符表中 int in_k(char b)/查找关系运算符 int i; if(remove()=false)/读下一位为假时,进行一位关系运算符识别 for(i=0;ir.length;i+) if(ri.length()
16、=1)/当关系运算符为一位时,尝试匹配 if(ri.equals(Character.toString(b) display(4, ri, );/输出关系运算符 getchar();/读下一位 return i;/返回所在位置 else/读下一位为假时,进行两位关系运算符识别 char a=new char2;/将两位字符放入a中 a0=b; getchar(); a1=ch; for(i=0;iTG(2)G-+TG|-TG(3)G-(4)T-FS(5)S-*FS|/FS(6)S-(7)F-(E)(8)F-i(1)实验数据结构说明 Char数组-Vn数组-非终结符表;char数组-Vt数组-终
17、结符;String数组-Gr数组-文法;Boolean型FIRST二维数组对应每个非终结符的first集,初始化均为false;Boolean型FOLLOW二维数组对应每个非终结符的Follow集,初始化均为false;String型M二维数组对应预测分析表(2)实验算法描述算法总的来讲不是很复杂,但是细节上可能有点复杂。总的是依据本实验的数据结构FIRST和FOLLOW集,这两个数据结构虽然浪费了不少空间但是确实让程序的实现变得更简单。First()总的来求所有的非终结符的first集,first1()分工为具体求某一个具体非终结符的first集;first2()则是求某一个集体的产生式的f
18、irst集。通过这三个函数的逐级分工来实现求所有的非终结符的first集。Follow集来说相对难求一点,但把它放到first集后面求来说相对简单一点。通过上面的分布设计就可以实现了。(3)算法流程图三、源程序代码和测试结果package exp3;import javax.swing.*;import java.awt.*;import java.awt.GridLayout.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;class WinGrid extends JFrame GridLay
19、out grid ; JPanel chessboard; JTextField text; JTextArea textShow; JButton button; ReaderListen listener; WinGrid() init(); setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); void init() setLayout(new FlowLayout(); text = new JTextField(10); setBounds(466,166,500,400); button = new JB
20、utton(读取); textShow = new JTextArea(9,30); listener = new ReaderListen(); listener.setJTextField(text); listener.setJTextArea(textShow); text.addActionListener(listener); button.addActionListener(listener); add(text); add(button); add(new JScrollPane(textShow); class ReaderListen implements ActionLi
21、stener JTextField text; JTextArea textShow; LL one=new LL(); String s; String temp1= new String186; public void setJTextField(JTextField text) this.text = text; public void setJTextArea(JTextArea textShow) this.textShow = textShow; public String S() String t = text.getText(); return t; Override public void actionPerformed(ActionEvent e) try String s = text.getText()+#; textShow.append(s+n); textShow.append(步骤+t+分析栈+t+剩余输入串+t+所用产生式+t+动作+n); one.right(s,temp1); for(int i = 0;i18;i+)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1