计算机13-3班实验报告_第1页
计算机13-3班实验报告_第2页
计算机13-3班实验报告_第3页
计算机13-3班实验报告_第4页
计算机13-3班实验报告_第5页
免费预览已结束,剩余30页可下载查看

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、编译原理实验合肥工业大学计算机科学与技术完成日期:2015.6.16实验一词法分析设计一、实验目的通过本实验的编程实践,使学生了解词法分析的任务,掌握词法分析程序设 计的原理和构造方法,使学生对编译的基本概念、原理和方法有完整的和清楚的 理解,并能正确地、熟练地运用。二、实验内容用 VC+/VB/JAVA 语言实现对 C 语言子集的源程序进行词法分析。通过输入源程序从左到右对字符串进行扫描和分解,依次输出各个单词的到错误则显示“Error”,然后跳过错误部分继续显示 ;同时以下是实现词法分析设计的主要工作:从源程序文件中读入字符。统计行数和列数用于错误单词的定位。删除空格类字符,包括回车、制表

2、符空格。按拼写单词,并用(内码,属性)二元式表示。编码及单 词符号自身值;若遇进行标识符登记符号表的管理。(属性值token 的机内表示)(5)如果发现错误则出错(6)根据需要是否填写标识符表供以后各阶段使用。三、程序设计四、实验结果实验二、LL(1)分析法一、实验目的通过完成分析法的语法分析程序,了解分析法和递归子程序法的区别和联系。使学生了解语法分析的功能,掌握语法分析程序设计的原理和构造方 法,训练学生掌握开发应用程序的基本方法。有利于提高学生的专业素质,为培 养适应社会多方面需要的能力。二、实验内容根据某一文法编制调试 LL(1)分析程序, 以便对任意输入的符号串 进行分析。构造分析表

3、,并利用分析表和一个栈来实现对上述程序设计语言的分 析程序。分析法的功能是利用 LL(1)控制程序根据显示栈栈顶内容、向前看符号以及 LL(1)分析表,对输入符号串自上而下的分析过程。三、程序设计四、实验结果实验三、LR(1)分析法一、 实验目的构造 LR(1)分析程序,利用它进行语法分析,判断给出的符号串是否为该文 法识别的句子,了解 LR( K)分析方法是严格的从左向右扫描,和自底向上的 语法分析方法。二、 实验内容对下列文法,用 LR(1)分析法对任意输入的符号串进行分析:(1)(2)(3)(4)(5)(6)E- E+TE-TT- T*F T-FF- (E)F- i三、 程序设计四、 实

4、验结果附录:实验源代码实验一、词法分析器package 词法分析器;import java.util.*;import java.io.*;public classysis sic Stringk=do,end,for,if,prf,scanf,then,while,auto,break,case,char,const,continue,default,double,else,enum,extern,float,goto,long,register,return,short,signed,sizeof,sic,struct,switch,typedef,union,unsigned,void,

5、volatile,inline;/1 关键字sic char s=,;,(,),;/2 分界符sic char m=+,-,*,/;/3 算术运算符sic String r=,=,;/4 关系运算符ArrayList ci=new ArrayList();/5 常数ArrayList id=new ArrayList();/6 标识符p;/搜索指示器String strtoken=;/存放 row;/行数line;/列数单词符号的字符串char ch;/存放读入源程序字符String instring;/存放输入源程序 ysis()/初始化instring=if i=0 for n+;na=4

6、8&c64&c96&c)/当其后的字符是=或时,要再读一个字符。否则不要再读。 return true;return false;void getbc()/检查空白直到读入字符非空白 while(ch= )getchar();void getchar()/读入下一个字符 p+;if(p=instring.length()-1)/当指针没有越界时,可读字符 ch=instring.charAt(p);if(ch=n)/当读到换行符时,行数加一,列数置一。再读下一个字符 change_r_l();getchar();else ch= ;/当指针越界时,置 ch 为空白符void retract()

7、/读入前一个字符 p-;ch=instring.charAt(p);void words()/识别字符串strtoken=;/先将 strtoken 置空while(isletter(ch)|isdigit(ch)|isline(ch)/当是字母,数字,下划线时继续识别字符串strtoken=strtoken+ch;/将新识别的字符加到 strtoken 后getchar();void num()/识别数字串strtoken=;/先将 strtoken 置空while(isdigit(ch)/当数字时继续识别数字串strtoken=strtoken+ch;/将新识别的字符加到 strtoken

8、 后getchar();if(isletter(ch)|isline(ch)/识别完数字串而其后是字母,下划线时出错处理while(isletter(ch)|isline(ch)|isdigit(ch)/当是字母,数字,下划线时继续识别错误数字串strtoken=strtoken+ch;/将新识别的字符加到 strtoken 后getchar();show(0,strtoken, );/输出错误数字串 strtoken=;/将 strtoken 置空返回void show(i,String s,char a)/各种输出处理 switch(i)case -1:System.out.prln(a+

9、(+row+,+line+);break;case 0:System.out.prln(s+(+row+,+line+);break;+Error+Error+Error+Error关case 1:System.out.prln(s+(1,+s+)+键字+(+row+,+line+);break;case 2:System.out.pr分界符+(+row+,+line+);break;case 3:System.out.pr算术运算符+(+row+,+line+);break;case 4:System.out.pr系运算符+(+row+,+line+);break;case 5:System

10、.out.pr常数+(+row+,+line+);ln(a+(2,+a+)+ln(a+(3,+a+)+关ln(s+(4,+s+)+ln(s+(5,+s+)+break;case 6:System.out.prln(s+标+(6,+s+)+识符+(+row+,+line+);break;line+;/列数加一void change_r_l()/改变行列数 row+;line=1;void handle()/输入串处理p=-1;/将搜索指示器置-1System.out.prln(要处理的语句为 : +instring); getchar();/读入一个字符whilntinstring.length

11、()/当搜索指示器没有越界时 getbc();/检查空白直到读入读入非空if(isdigit(ch)/当 ch 为数字时进行数字串识别num();/数字串识别if(strtoken.length()!=0)/经过数字串识别后,如果 strtoken 不为空if(reseverci(strtoken)=-1)/如果 strtoken 不在 ci 表中,将 strtoken 加入 ci 表中dd(strtoken);/将 strtoken 加入 ci 表中show(5,strtoken, );/输出数字串System.out.prln(one.strtoken+是第+(one.ci.size()-

12、1)+个常数);/else /如果 strtoken 在 ci 表中,仅输出/System.out.prln(one.strtoken+是第+one.reseverci(one.strtoken)+个已经识别的常数);show(5,strtoken, );/输出数字串/拼出数字串else if(isletter(ch)/当 ch 为字母时进行字符串识别words();/字符串识别if(reserve(strtoken)=-1)/如果 strtoken 不在 k 表中if(reseverid(strtoken)=-1)/如果 strtoken 不在 id 表中id.add(strtoken);/

13、将 strtoken 加入 id 表中show(6,strtoken, );/输出标识串System.out.prln(one.strtoken+是第+(one.id.size()-1)+个标识符);/else /如果 strtoken 在 id 表中System.out.prln(one.strtoken+是第+one.reseverid(one.strtoken)+/个已经识别的标识符);show(6,strtoken, );/输出标识串else /如果 strtoken 在 k 表中/System.out.prln(one.strtoken+是第+one.reserve(one.strt

14、oken)+个关键字);show(1,strtoken, );/输出关键字/拼出字符串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)/关系运算符处理包含在 one.in_k(one.ch)中elseshow(-1, ,ch);/error getchar();/读下一位reserve(String s)/判断字符串是否是保留字 i;for(i=0;ik.length;i+) if(s.equals(ki)

15、return i;/是保留字,就返回编码return -1;/不是保留字,就返回-1reseverid(String s)/判断识别的标志符是否已经在 id 表中i;for(i=0;iid.size();i+)if(s.equals(id.get(i)return i;/识别的标志符已经在 id 表中,返回位置return -1;/识别的标志符不在 id 表中,返回-1reseverci(String s)/判断识别的数字串是否已经在 ci 表中i;for(i=0;ici.size();i+)if(s.equals(ci.get(i)return i;/识别的数字串已经在 ci 表中,返回位置

16、return -1;/识别的数字串不在 ci 表中,返回-1in_s(char c)/查找分界符 i;for(i=0;is.length;i+)if(c=si)/与某个分界符配备时System.out.prln(c+是分界符表中的第+i+个分界符); show(2, ,c);/输出分界符getchar();/读下一位 return i;/返回所在位置/return -1;/不在分界符表中in_m(char c)/查找算术运算符 i;if(c=+|c=-) getchar();if(ch = +&c=+)System.out.prln(+算术运算符+(+row+,+line+);getchar(

17、); return 0;if(ch = -&c=-)System.out.prln(-+算术运算符+(+row+,+line+);getchar(); return 0;for(i=0;im.length;i+)/retract();if(c=mi)/与某个算术运算符配备时+(3,+)+(3,+-+)+System.out.prln(c+是算术运算符表中的第+i+个算术运算符); show(3, ,c);/输出算术运算符getchar();/读下一位 return i;/返回所在位置/return -1;/不在算术运算符表中in_k(char b)/查找关系运算符 i;if(remove()=

18、false)/读下一位为假时,进行一位关系运算符识别 for(i=0;ir.length;i+)if(ri.length()=1)/当关系运算符为一位时,尝试匹配 if(ri.equals(Character.toString(b)System.out.prln(b+是关系运算符表中的第+i+个关系运算符); show(4, ri, );/输出关系运算符getchar();/读下一位 return i;/返回所在位置/else/读下一位为假时,进行两位关系运算符识别 char a=new char2;/将两位字符放入 a 中a0=b;getchar(); a1=ch;for(i=0;ir.le

19、ngth;i+)if(ri.length()=2)/当关系运算符为两位时,尝试匹配 if(ri.equals(String.copyValueOf(a)System.out.prln(String.copyValueOf(a)+是关系运算符表中的第/+i+个关系运算符);show(4, ri, );/输出关系运算符 getchar();/读下一位return i;/返回所在位置retract();/两位关系运算符匹配失败,读入前一个字符return -1;/不在关系运算表中void readstr()throws Exception/从命令行读入源程序BufferedReader sin=ne

20、w BufferedReader(new InputStreamReader(System.in);/从命令行输入的输入流/BufferedWriter fw=new BufferedWriter(new FileWriter (F:+ File.separator+fun.txt); /输出流,输出到 fun.txt instring=sin.readLine();while(instring.length()!=0)/将从命令行的输入写入 fun.txt/fw.write(instring);/fw.newLine();handle();/处理读入的源程序 change_r_l();ins

21、tring=sin.readLine();/fw.close();/*void readtext()throws Exception/从文本读入源程序BufferedReader f =new BufferedReader(new FileReader (F:+ File.separator+fun.txt);instring=f.readLine(); while(instring!=null)handle();/处理读入的源程序 change_r_l();instring=f.readLine();f.close();*/void readtext() throws IOException

22、FileReader fr1=new FileReader(C:UsersDesktop+ File.separator +实验.txt);BufferedReader br1=new BufferedReader(fr1); instring=br1.readLine();while(instring!=null)handle();/处理读入的源程序 change_r_l();instring=br1.readLine();br1.close();实验二、LL(1)分析法import java.io.*;public class LL Vn = E, G, T, S, F ; / 非终结符集

23、StringString String String# ; / 终结符集Vt = i, +,-,*,/, (, ),分析表P = new String58; /fenxi; / 分析栈count = 1; / 步骤count1 = 1;/分析栈指针0;/分析表指针/ 输入的字符串count2 = 0, count3 =String inputString = ;flag;public void setCount(this.count = count;count,count1,count2,count3)this.count1this.count2 this.count3 flag= false

24、;=count1;count2; count3;public void setFenxi() / 初始化分析栈fenxi = new String20; fenxi0 = #;fenxi1 = E;public void setP() / 初始化分析表for (i = 0; i 5; i+) for (j = 0; j TG;-TG;-+TG;-TG;-;-;-FS;-FS;-;-;-*FS;P34P36P37P40P46=-/FS;-;-;-i;-(E); / 打印出分析表已构建好的分析表);System.out.prSystem.out.prln(ln();for (i=0;i8; i+)

25、System.out.pr(+Vti);System.out.prSystem.out.prln();ln();for (i=0;i5; i+)+Vni+System.out.pr();for (j=0; j0) l = 10-Pij-1.length();for (k=0; k= 0) for (i=0; i8; i+) if (fenxicount1.equals(Vti) / 判断分析栈栈顶的字符是否为终结符flage = true;break;if (flage) / 为终结符时/System.out.prln(2);if (fenxicount1.equals(inphar) if

26、(fenxicount1.equals(#)&inputString.length()=1) /栈顶符号为结束标志时/System.out.prln(最后一个); String fenxizhan = ;i=0; i=P.length; i+) / 拿到分析栈里的全部内for (容(滤去null)if (fenxii = null) break;else fenxizhan = fenxizhan + fenxii;/ 输出当前分析栈情况,输入字符串,所用产生式或匹配System.out.pr( + count);String countToString =eger.toString(coun

27、t);farWay = 14 - countToString.length();for (k=0; kfarWay; k+) System.out.pr( );System.out.prfarWay = 20 -(fenxizhan);fenxizhan.length(); kfarWay; k+) for (k=0;System.out.pr( );System.out.pr farWay = 25 -(inputString);inputString.length(); kfarWay; k+) for (k=0;System.out.pr( );System.out.prln(接受);

28、flag = true;return true;else/ 分析栈栈顶符号不为结束标志符号时String fenxizhan = ;for (i=0; i=P.length; i+) / 拿到分析栈里的全部内容(滤去null)if (fenxii = null) break; else fenxizhan = fenxizhan + fenxii;/ 输出当前分析栈情况,输入字符串,所用产生式或匹配System.out.pr(+count);String countToString =eger.toString(count);farWay = 14 - countToString.length

29、();for (k=0; kfarWay; k+) System.out.pr( );System.out.pr farWay = 20 -(fenxizhan);fenxizhan.length(); kfarWay; k+) for (k=0;System.out.pr( );System.out.pr farWay = 25 -(inputString);inputString.length(); k 1) / 当当前输入字符串的);长度大于1时,将当前输入字符从输入字符串中除去inputString = inputString.substring(1,inputString.lengt

30、h();else / 当前输入串长度为1时inphar = inputString;/System.out.pr +inputString + +Pcount3count2);/System.out.pr count+; judge();ln( +count+ +fenxizhan+har + 匹配 );ln(count + inpelse / 判断与与输入符号是否一样为结束标志分析到第 + count + 步时出System.out.prln(错!);flag = false;return false;else / 非终结符时/System.out.prln(3);fla = false;f

31、or (i=0; i8; i+) / 查询当前输入符号位于终结符集的位置if (inphar.equals(Vti) fla = true;count2 = i;break;if(!fla)System.out.prln(分析到第 + count + 步时出错!);flag = false;return false;for (i=0; i5; i+) / 查询栈顶的符号位于非终结符集的位置if (fenxicount1.equals(Vni) count3 = i;break;if (Pcount3count2 != error) / 栈顶的非终结符与输入的终结符存在产生式时String p

32、= Pcount3count2;String s1 = p.substring(2, p.length(); / 获取对应的产生式if (s1.equals() / 产生式推出“”时String fenxizhan = ;for (i=0; i=P.length; i+) if (fenxii = null) break;else fenxizhan = fenxizhan + fenxii;/ 输出当前分析栈情况,输入字符串,所用产生式或匹配System.out.pr( + count);String countToString =eger.toString(count);farWay =

33、14 - countToString.length();for (k=0; kfarWay; k+) System.out.pr( );System.out.pr farWay = 20 -(fenxizhan);fenxizhan.length(); kfarWay; k+) for (k=0;System.out.pr( );System.out.pr farWay = 25 -(inputString);inputString.length(); kfarWay; k+) for (k=0;System.out.pr( );System.out.prln(fenxicount1 + Pc

34、ount3count2);/ 将栈顶符号出栈,栈顶指针指向下一个元素fenxicount1 = null; count1 -= 1; count+;judge();else / 产生式不推出“”时k = s1.length(); String fenxizhan = ;for (i=0; i=P.length; i+) if (fenxii = null) break;else fenxizhan = fenxizhan + fenxii;/ 输出当前分析栈情况,输入字符串,所用产生式或匹配System.out.pr(+count);String countToString =eger.toS

35、tring(count);farWay = 14 - countToString.length();for (o=0; ofarWay; o+) System.out.pr( );System.out.pr farWay = 20 -(fenxizhan);fenxizhan.length(); ofarWay; o+) for (o=0;System.out.pr( );System.out.prfarWay = 25 -(inputString);inputString.length(); ofarWay; o+) for (o=0;System.out.pr( );System.out.

36、prln(fenxicount1 + Pcount3count2);i=1; i=k; i+) / 将产生式右部的各个符号入栈for (String s2 = s1.substring(s1.length() - 1, s1.length();s1 = s1.substring(0, s1.length() - 1);if (s2.equals() s2 = s1.substring(s1.length() - 1, s1.length()+ s2; i+;s1 = s1.substring(0, s1.length() - 1);fenxicount1 = s2;if (i k)count1

37、+;/System.out.prln(count1= + count1);/System.out.prln( +count+ +fenxizhan+ +inputString +Pcount3count2);count+;/System.out.prln(count); judge();else +分析到第+ count + 步时出错!);System.out.prflag = false; return false;ln(returnflag ;public sLL l =l.setP();ic void main(String args) new LL();String inputflag

38、while (flag)try = ;= true;InputStreamReader isr = new InputStreamReader(System.in);BufferedReader br = new BufferedReader(isr);System.out.prSystem.out.prln();(请输入字符串(输入exit退出):);input = br.readLine();catch (Exception e) e.prStackTrace();if(input.equals(exit)flag = false;elsel.setInputString(input);l

39、.setCount(1,l.setFenxi(); System.out.pr System.out.prSystem.out.pr1, 0, 0);ln();ln(分析过程); ln();ln(步骤分析栈剩余输System.out.pr|入串所用产生式|);System.out.prln();b = l.judge();/System.out.prln(0); System.out.prln();if(b)System.out.prln(您输入的字符串+input+是该文发的一个句子);elseSystem.out.prln(您输入的字符串+input+有词法错误!);实验三、LR(1)分析

40、法import java.util.Scanner;import java.util.Stack;public class LR char Vn = E,T,#;char Vt = +,*,(,),i;Stack m = new Stack (); Stack n = new Stack (); String explain;public LR() System.out.prln(步骤+tt+状态栈+tt+符号栈+tt+剩余输入串 +tt+动作说明);isvn(char c)for(i = 0;i Vn.length;i+) if(c = Vni)return true;return fals

41、e;isvt(char c)for(i = 0;i T 规约, GOTO( + i + ,E) = +j+入栈; return 2;else if(a = 2 & b = ) m.pop();i = m.peek();j = GOTO(i, E);m.push(j); n.pop();n.push(E);explain = r2:E-T 规约, GOTO( + i + ,E) = +j+入栈; return 2;else if(a = 2 & b = #) m.pop();i = m.peek();j = GOTO(i, E);m.push(j); n.pop();n.push(E);expl

42、ain = r2:E-T 规约, GOTO( + i + ,E) = +j+入栈; return 2;else if(a = 5 & b = +) m.pop();i = m.peek();j = GOTO(i, F);m.push(j); n.pop();n.push(F);explain = r6:F-i 规约, GOTO( + i + ,F) = +j+入栈; return 2;else if(a = 3 & b = +) m.pop();i = m.peek();j = GOTO(i, T);m.push(j); n.pop();n.push(T);explain = r4:T-F 规

43、约, GOTO( + i + ,T) = +j+入栈; return 2;else if(a = 3 & b = ) m.pop();i = m.peek();j = GOTO(i, T);m.push(j); n.pop();n.push(T);explain = r4:T-F 规约, GOTO( + i + ,T) = +j+入栈;return 2;else if(a = 3 & b = #) m.pop();i = m.peek();j = GOTO(i, T);m.push(j); n.pop();n.push(T);explain = r4:T-F 规约, GOTO( + i + ,

44、T) = +j+入栈; return 2;else if(a = 5 & b = *)m.pop();i = m.peek();j = GOTO(i, F);m.push(j); n.pop();n.push(F);explain = r6:F-i 规约, GOTO( + i + ,F) = +j+入栈; return 2;else if(a = 5 & b = ) m.pop();i = m.peek();j = GOTO(i, F);m.push(j); n.pop();n.push(F);explain = r6:F-i 规约, GOTO( + i + ,F) = +j+入栈; retu

45、rn 2;else if(a = 3 & b = *) m.pop();i = m.peek();j = GOTO(i, T);m.push(j); n.pop();n.push(T);explain = r4:T-F 规约, GOTO( + i + ,T) = +j+入栈; return 2;else if(a = 5 & b = #) m.pop();i = m.peek();j = GOTO(i, F);m.push(j);n.pop();n.push(F);explain = r6:F-i 规约, GOTO( + i + ,F) = +j+入栈; return 2;else if(a

46、= 10 & b = #)m.pop(); m.pop();m.pop(); i = m.peek();j = GOTO(i, T);m.push(j); n.pop();n.pop();n.pop();n.push(T);explain = r3:T-T*F 规约, GOTO( + i + ,T) = +j+入栈; return 2;else if(a = 10 & b = +) m.pop(); m.pop();i = m.peek();j = GOTO(i, T);m.push(j); n.pop();n.pop();n.push(T);explain = r3:T-T*F 规约, GO

47、TO( + i + ,T) = +j+入栈; return 2;else if(a = 10 & b = ) m.pop(); m.pop();i = m.peek();j = GOTO(i, T);m.push(j); n.pop();n.pop();n.push(T);explain = r3:T-T*F 规约, GOTO( + i + ,T) = +j+入栈; return 2;else if(a = 9 & b = +)if(!m.empty()m.pop();m.pop();i = m.peek();j = GOTO(i, E);m.push(j); n.pop();n.pop();

48、n.push(E);explain = r1:E-E+T 规约, GOTO( + i + ,E) = +j+入栈; return 2;else if(a = 9 & b = )m.pop(); m.pop(); i = m.peek();j = GOTO(i, E);m.push(j);n.pop();n.pop();n.push(E);explain = r1:E-E+T 规约, GOTO( + i + ,E) = +j+入栈; return 2;else if(a = 9 & b = #) m.pop(); m.pop();i = m.peek();j = GOTO(i, E);m.push(j); n.pop();n.pop();n.push(E);explain = r1:E-E+T 规约, GOTO( + i + ,E) = +j+入栈; return 2;else if(a = 11 & b = +) m.pop(); m.pop();i = m.peek();j = GOTO(i, F);m.push(j); n.pop();n.pop();n.push(F);explain = r5:F-(E)规约, GOTO( + i + ,F) = +j+入栈; return 2;else if(a

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论