广东药学院信息工程 编译原理实验五、六

  • 格式:doc
  • 大小:218.50 KB
  • 文档页数:8

实验五、六语法分析程序设计[实验目的]:1.了解语法分析的主要任务。

2.熟悉编译程序的编制。

[实验内容]:根据某文法,构造一基本递归下降语法分析程序。

给出分析过程中所用的产生式序列。

[实验要求]:1.构造一个小语言的文法,例如,Pascal语言子集的文法,考虑其中的算术表达式文法:G[<表达式>]:G[E]:<表达式>→<表达式>+<项>|<表达式>-<项>|<项> E→E+T|T<项>→<项>*<因式>|<项>/<因式>|<因式> T→T*F|F<因式>→<标识符>|<无符号整数>|(<表达式>) F→i|(E)2.设计语法树的输出形式,例如:产生式……3.编写递归下降语法分析程序实现基本的递归下降分析器,能够分析任给的符号串是否为该文法所定义的合法算术表达式。

实验报告中要说明分析使用的方法。

4.生成并输出分析过程中所用的产生式序列:1 产生式12 产生式2……[实验步骤]:1.写出一个小语言的算术表达式文法。

2.写出该小语言的算术表达式等价的LL(1)文法。

例如:G[E]:其中E→TG G为E’E→+TG|^ ^为εT→FS S为T’T→*FS|^F→i|(E)3.编写递归下降语法分析程序。

首先,去掉左递归<表达式>→<项> | <表达式> + <项> | <表达式> - <项> 改为:<表达式>→<项>{(+ | -)<项>}<项>→<因子> | <项> * <因子> | <项> / <因子> 改为:<项>→<因子>{(* | /)<因子>}则文法变为<表达式>→<项>{(+ | -)<项>}<项>→<因子>{(* | /)<因子>}<因子>→ID|NUM|(<表达式>)非终结符号的分析程序如下(按顺序):<表达式>→<项>{(+ | -)<项>}<项>→<因子>{(* | /)<因子>}<因子>→ID|NUM|(<表达式>)4调试运行程序。

5.结果分析。

6.撰写实验报告。

[实验报告]:(一人一组,交纸质版)1.写出实现的算法。

2.import java.io.*;3.import java.util.Scanner;4.public class Xmen5.{6.static FileInputStream rf=null;7.FileOutputStream wf=null;8.static StringBuffer buffer=new StringBuffer(),9.tree=new StringBuffer(),10. tbf=new StringBuffer("\n→");11. static int step,ptr,es,flag;12. public static void main(String args[])13. {14. parse();15. }16. static void parse()17. {18. init();19. System.out.println("分析:"+buffer+"\n");20. System.out.println("步骤\t分析字符\t分析串\t余留输入串\t所用产生式");21. tree.append("E");22. E();23. if(es==1&&ptr==buffer.length()-1)24. {25. System.out.println("ACCEPT\n");26. System.out.println(tree);27. }28. else29. {30. System.out.println("ERROR\n");31. }32. }33. static void init()34. {35. step=0;ptr=0;es=1;flag=2;36. int b;37. System.out.print("输入文件路径:");38. Scanner input=new Scanner(System.in);39. try40. {41. rf =new FileInputStream(new File(input.next()));42. while((b=rf.read())!=-1)43. buffer.append((char)b);44. rf.close();45. }46. catch(Exception e)47. {48. System.out.println(e);49. }50. }51. static void outPrint(String rule)52. {53.System.out.println(++step+"\t"+buffer.charAt(ptr)+"\t"+"\t"+buffe r.substring(0,ptr)+"\t"+buffer.substring(ptr)+"\t"+"\t"+rule);54. }55. static boolean Pop()56. {57. if (ptr<buffer.length()- 1)58. {59. ptr++;60. outPrint("");61. return true;62. }63. else64. {65. return false;66. }67. }68. static void Error()69. {70. es=0;71. outPrint("Error");72. if(!Pop())73. {74. return;75. }76. }77. static void E()78. {79. tbf.replace(flag,flag+1,"TE'");80. tree.append(tbf);81. outPrint("E→TE'");82. T();83. E_DOT();84. }85. static void T()86. {87. tbf.replace(flag,flag+1,"FT'");88. tree.append(tbf);89. outPrint("T→FT'");90. F();91. T_DOT();92. }93. static void E_DOT()94. {95. if(buffer.charAt(ptr)=='+')96. {97. tbf.replace(flag,flag+2,"+TE'");flag++;98. tree.append(tbf);99. outPrint("E'→+TE'");100.if(!Pop())101.{102.return;103.}104.T();105.E_DOT();106.}107.else108.{109.tbf.replace(flag,flag+2,"");110.tree.append(tbf);111.outPrint("E'→ε");112.}113.}114.static void T_DOT()115.{116.if(buffer.charAt(ptr)=='*')117.{118.tbf.replace(flag,flag+2,"*FT'");flag++; 119.tree.append(tbf);120.outPrint("T'→*FT'");121.if(!Pop())122.{123.return;124.}125.F();126.T_DOT();128.else129.{130.tbf.replace(flag,flag+2,"");131.tree.append(tbf);132.outPrint("T'→ε");133.}134.}135.static void F()136.{137.if(buffer.charAt(ptr)=='(')138.{139.tbf.replace(flag,flag+1,"(E)");flag++; 140.tree.append(tbf);141.outPrint("F→(E)");142.if(!Pop())143.{144.return;145.}146.E();147.if(buffer.charAt(ptr)==')')148.{149.flag++;150.if(!Pop())151.{152.return;153.}154.}155.else156.{157.Error();158.}159.}160.else if(buffer.charAt(ptr)=='i')161.{162.tbf.replace(flag,flag+1,"i");flag++; 163.tree.append(tbf);164.outPrint("F→i");165.if(!Pop())166.{167.return;168.}169.}170.else172.Error();173.}174.}175.}画出流程图。

实验设计过程中出现的问题及解决的方法。

实验过程中很多都不太会做,很多事问同学的,也有很多事根据同学的而写的。