《2022年编译原理-太原理工大学 .pdf》由会员分享,可在线阅读,更多相关《2022年编译原理-太原理工大学 .pdf(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、编译原理实验报告本科实验报告课程名称:编译原理 D 实验地点:实验室专业班级:学号:_ 学生姓名:java 编译指导教师:成绩:2015 年月日名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 12 页 - - - - - - - - - 实验一、无符号数的词法分析程序(4 学时)内容:掌握词法分析的基本思想, 并用高级语言编写无符号数的词法分析程序。要求:从键盘上输入一串字符(包括字母、数字等),最后以“;”结束,编写程序识别出其中的无符号数。无符号数文法规则可定义如下:
2、 .E比例因子E + - 0 1 2 3. 9 读无符号数的程序流程图见下图名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 12 页 - - - - - - - - - 开始0=w,p,j1=e数字否出错数值=dw*10+d=w取下一字符数字否是 . 否是E否退一字符整型 =CJ1取下一字符数字否出错数值=dw*10+d=wj+1=j取下一字符数字否是E否取下一字符是-否是+否数字否数值=dp*10+d=p取下一字符数字否退一字符实型 =CJ1W*10C*P-J=CJ2出
3、口-1=e取下一字符出错YNNNNYNYYNNYYNNYNYYNYYY实验代码:package text_1; import java.util.*; publicclass Text1 publicstaticvoid main(String args) int p = 0, w = 0, w1 = 0, j = 0, i = 0, d = 0, e = 1;/定义初值double w2 = 0; String str; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共
4、12 页 - - - - - - - - - System.out .println( 请输入一串字符串( 以; 结束 ) : ); Scanner m = new Scanner(System.in ); str = m.nextLine(); char ch1 = str.toCharArray(); /字符串转化为字符数组/* * 检测字符数组for(i=0;ich1.length;i+) System.out.print(ch1i+ ); */while (i 9 | ch1i = 0 & ch1i = 0 & ch1i = 0 & ch1i 1) w2 = w / (Math.pow
5、(10.0, j - 1); System.out .println( 实型数为: +w2+ *10+ +(e*(p-j+1);/科学计数法输出实型j = 0; w2 = 0; w = 0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 12 页 - - - - - - - - - p = 0; elseSystem.out .println( 输入错误 ! ); if (ch1i = 0 & ch1i = 0& ch1i 1) w2 = w / (Math.pow(1
6、0.0, j - 1); System.out .println( 实型数为: +w2+ *10+ +(e*(p-j+1); j = 0; w2 = 0; w = 0; p = 0; elseSystem.out .println( 输入错误 ! ); else i+; if (ch1i = 0 & ch1i = 0 & ch1i = 0 & ch1i = 0 & ch1i 1) w2 = w / (Math.pow(10.0, j - 1); System.out .println( 实型数为: + w2 + *10+ + (e * (p - j + 1); j = 0; w2 = 0; w
7、 = 0; p = 0; elseSystem.out .println( 输入错误 ! ); if (ch1i = 0 & ch1i = 0 & ch1i 1) w2 = w / (Math.pow(10.0, j - 1); System.out .println( 实型数为: +w2+ *10 + +(e*(p-j+1); j = 0; w2 = 0; w = 0; p = 0; elseSystem.out .println( 输入错误 ! ); elseif (ch1i != E) /输出小数System.out .println( 小数为: + w + . + w1); w = 0
8、; w1 = 0; j = 0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 12 页 - - - - - - - - - 运行结果:实验二、逆波兰式生成程序内容:掌握语法分析的基本思想, 并用高级语言编写逆波兰式生成程序(4 学时)要求:利用逆波兰式生成算法编写程序,将从键盘上输入的算术表达式(中缀表达式)转化成逆波兰式。逆波兰表达式的生成过程涉及到运算符的优先级,下表中列出几个常用运算符的优先关系。常用运算符优先关系矩阵如上表所示的优先关系矩阵表示了+,-,*,/
9、 , (, )等七种运算符之间的相互优先关系。 “、”三种符号分别代表 “大于” 、 “小于” 、 “相等”三种优先关系。左边的“”与右边的“(”之间没有优先关系存在,所以表中为空白。+ - * / ()+ - * / ()右关系左名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 12 页 - - - - - - - - - 逆波兰表达式生成算法的关键在于比较当前运算符与栈顶运算符的优先关系, 若当前运算符的优先级高于栈顶运算符,则当前运算符入栈,若当前运算符的优先级低于栈
10、顶运算符,则栈顶运算符退栈。下面给出了逆波兰表达式生成算法的流程图。(为了便于比较相邻运算符的优先级, 需要设立一个工作栈, 用来存放暂时不能处理的运算符,所以又称运算符栈。开始输入运算符优先关系从左往右扫描中缀表达式输入串为空运算符栈是否为空比较当前运算符于栈顶运算符的优先级当前运算符的优先级高当前运算符是)退栈输出栈为空结束退栈输出输出入栈入栈栈顶为(栈为空退栈输出退栈ERRORNYNNNYYNNYYYNNYY名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 12 页
11、- - - - - - - - - 实验代码:package text_2 import java.util.*; publicclass Text2 privatecharOperator_Precedence_Relation_Matrix = , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ; privatecharInfix_Expression; / 字符串 infix用于表示要处理的中缀表达式private String Reverse_Polish_Expressi
12、on = new String();/ 字符串reversePlishExpression用于表示处理结果逆波兰式private String Analysis_Stack = new String();/字符串 analysisStack用于表示分析栈privateintLength_Infix_Expression = 0;/ 中缀表达式的长度, 初始值为 0privateintmatch_Parentheses = 1;/ 用来查看左右括号是否配对正确privateintcount = 0; privatevoid init(String str) Infix_Expression =
13、str.toCharArray(); Length_Infix_Expression = Infix_Expression. length; privateint Operator_Judgement(char currentOperator) int flag = -1; switch (currentOperator) case+: flag = 0; break; case-: flag = 1; break; case*: flag = 2; break; case/: flag = 3; case: flag = 4; break; case(: 名师资料总结 - - -精品资料欢迎
14、下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 12 页 - - - - - - - - - flag = 5; break; case): flag = 6; break; return flag; void convert_Process(String str) init(str); while (true) match_Parentheses = 0; if (count = Length_Infix_Expression) / 检测输入串为空while ( Analysis_Stack.length
15、() != 0) / 检测分析栈if( Analysis_Stack.charAt(Analysis_Stack.length() - 1) = () System.out .println(n您输入的中缀表达式中有无法配对的 ( 括号,请仔细核实!); System.exit(0); else Reverse_Polish_Expression += Analysis_Stack.charAt(Analysis_Stack.length() - 1); Analysis_Stack = Analysis_Stack.substring(0, Analysis_Stack.length() -
16、 1); / 退栈输出System.out .println( 逆波兰式为: + Reverse_Polish_Expression); System.exit(0); else if (Operator_Judgement(Infix_Expression count) = -1) Reverse_Polish_Expression += Infix_Expression count; else while ( Analysis_Stack.length() != 0) / 检测分析栈if( Operator_Precedence_Relation_MatrixOperator_Judgem
17、ent(Analysis_Stack.charAt(Analysis_Stack.length() - 1)Operator_Judgement(Infix_Expression count) = ) Analysis_Stack += Infix_Expression count; break; else 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 12 页 - - - - - - - - - if ( Infix_Expression count != ) Re
18、verse_Polish_Expression += Analysis_Stack.charAt(Analysis_Stack.length() - 1); Analysis_Stack = Analysis_Stack.substring(0, Analysis_Stack.length() - 1); else while ( Analysis_Stack.length() = 0 | Analysis_Stack.charAt(Analysis_Stack.length() - 1) != () if (Analysis_Stack.length() = 0) System.out.pr
19、intln(n您输入的中缀表达式中有无法配对的 ) 括号,请仔细核实! ); System.exit(0); else Reverse_Polish_Expression += Analysis_Stack.charAt(Analysis_Stack.length() - 1); Analysis_Stack = Analysis_Stack.substring( 0, Analysis_Stack.length() - 1); if ( Analysis_Stack.charAt(Analysis_Stack.length() - 1) = () Analysis_Stack = Analy
20、sis_Stack.substring( 0, Analysis_Stack.length() - 1); match_Parentheses = 1; break; if ( Analysis_Stack.length() = 0) if (Infix_Expression count != ) Analysis_Stack += Infix_Expression count; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 12 页 - - - - - - - -
21、- elseif ( match_Parentheses != 1) System.out.println(n您输入的中缀表达式中有无法配对的 ) 括号,请仔细核实! ); System.exit(0); count+; publicstaticvoid main(String args) System.out .println( 请输入中缀表达式: ); Scanner Expression = new Scanner(System.in ); String str1 = Expression.nextLine(); new Text2().convert_Process(str1); 实验结果:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 12 页 - - - - - - - - -