太原理工大学编译原理实验

  • 格式:pdf
  • 大小:164.47 KB
  • 文档页数:14
PC 机+Java 语言编程环境
四、实验结果与分析
1.实验内容: package com_text4; import java.io.*;
读无符号数的程序流程图见下图
2
开始
出错
0=>w,p,j 1=>e Y
N
数字否
Y
数值=〉d w*10+d=>w
Y 取下一字符
数字否 Y N
是‘ .’否
N
Y
是‘E’否
N
退一字符
‘整型’=〉 CJ1
Y
取下一字符
Y
Y 取下一字符
数字否
N
Y 数值=〉d w*10+d=>w
j+1=>j
取下一字符
数字否 N
是‘E’否
+ (e * (p - j + 1))); j = 0; w2 = 0; w = 0; p = 0; } else System.out.println("您输入有误!");
} else if (m[i] == '+') { i++; if (m[i] >= 48 && m[i] <= 57) { do { d = m[i] - 48; p = p * 10 + d; i++; } while (m[i] >= 48 && m[i] <= 57); if (j > 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; } else System.out.println("您输入有误!");
6
p = 0; } } else System.out.println("您输入有误!");
} else if (m[i] == '+') { i++; if (m[i] >= 48 && m[i] <= 57) { do { d = m[i] - 48; p = p * 10 + d; i++; } while (m[i] >= 48 && m[i] <= 57); if (j > 1) { w2 = w / (Math.pow(10.0, j - 1)); System.out.println("实型数为:" + w2 + w1 + "*10" + " " + (e * (p + j - 1))); w = 0; w1 = 0; j = 0; w2 = 0; p = 0; } else { System.out.println("实型数为:" + w + '.' + w1 + "*10" + " " + (e * (p + j - 1))); w = 0; w1 = 0; j = 0; w2 = 0; p = 0; } } else System.out.println("您输入有误!");
兰式。 逆波兰表达式的生成过程涉及到运算符的优先级,下表中列出几个常用运算符的优先关系。 如表所示的优先关系矩阵表示了+,-,*,/,↑,(,)等七种运算符之间的相互优先关系。“>、<、 =”三种符号分别代表“大于”、“小于”、“相等”三种优先关系。左边的“=”与右边的“(”之间没有优 先关系存在,所以表中为空白。 逆波兰表达式生成算法的关键在于比较当前运算符与栈顶运算符的优先关系,若当前运算符的优先级 高于栈顶运算符,则当前运算符入栈,若当前运算符的优先级低于栈顶运算符,则栈顶运算符退栈。
public class Text1 { /** * @param args */ public static void main(String[] args) throws Exception { // TODO Auto-generated method stub int p = 0, w = 0, w1 = 0, j = 0, i = 0, d = 0, e = 1; double w2 = 0; String str; System.out.println("请输入一串字符以;结束:"); BufferedReader buf = new BufferedReader( new InputStreamReader(System.in)); str = buf.readLine(); char m[] = new char[100]; for (i = 0; i < str.length(); i++) { m[i] = str.charAt(i); } i = 0; while (i < str.length()) { if (m[i] < 48 || m[i] > 57) { i++; } else { do { d = m[i] - 48; w = w * 10 + d; j++; i++; } while (m[i] >= 48 && m[i] <= 57); // System.out.println("chesi"+m[i]); if (m[i] != '.') { if (m[i] != 'E') { System.out.println("整型数为:" + w); j = 0; w = 0; } else { i++; if (m[i] == '-') { e = -1; i++; if (m[i] >= 48 && m[i] <= 57) { do {
7
p = 0; } else {
System.out.println("实型数为:" + w + '.' + w1 + "*10" + " " + (e * (p + j - 1)));
w = 0; w1 = 0; j = 0; w2 = 0; p = 0; } } else System.out.println("您输入有误!"); } } else System.out.println("您输入有误!"); } } } } }2.实验结果:
下面给出了逆波兰表达式生成算法的流程图。(为了便于比较相邻运算符的优 先级,需要设立一个工作栈,用来存放暂时不能处理的运算符,所以又称运算符栈)。 常用运算符优先关系矩阵


+
-
*
/

()
系 左
+







-







*







/






























9
开始
输入运算符优 先关系
从左往右扫描中缀 表达式
Y
结束
Y 输入串为空
N
运算符
N
Y
栈是否为空
Y
N
比较当前运算符于栈顶 运算符的优先级
栈为空 输出 入栈
N 退栈输出
当前运算符的优先级 高
N
当前运算符是 ‘)’
N
退栈输出
Y
入栈
Y
栈顶为‘(’பைடு நூலகம்
Y
N
栈为空
Y
N
退栈输出
退栈 ERROR
10
三、主要仪器设备
本科实验报告
课程名称:
编译原理
实验项目:无符号数的词法分析程序(实验一) 基本程序设计(实验二)
实验地点: 计算机学院软件实验室
专业班级: 软件 1132 学号:2011005267
学生姓名:
班德盛
指导教师:
崔冬华
2014 年 4 月 15 日
1
一、实验目的和要求
1.培养学生初步掌握编译原理实验的技能。 2.验证所学理论、巩固所学知识并加深理解。 3. 对学生进行实验研究的基本训练。
} else { if (m[i] >= 48 && m[i] <= 57) { do { d = m[i] - 48; p = p * 10 + d; i++; } while (m[i] >= 48 && m[i] <= 57); if (j > 1) { w2 = w / (Math.pow(10.0, j - 1)); System.out.println("实型数为:" + w2 + w1 + "*10" + " " + (e * (p + j - 1))); w = 0; w1 = 0; j = 0; w2 = 0;