logo资料库

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

第1页 / 共18页
第2页 / 共18页
第3页 / 共18页
第4页 / 共18页
第5页 / 共18页
第6页 / 共18页
第7页 / 共18页
第8页 / 共18页
资料共18页,剩余部分请下载后查看
本科实验报告 课程名称: 编译原理 实验项目:无符号数的词法分析程序(实验一) 实验地点: 计算机学院软件实验室 专业班级: 学号: 学生姓名: 指导教师: 冯秀芳 2013 年 11 月 16 日 1
一、实验目的和要求 1.培养学生初步掌握编译原理实验的技能。 2.验证所学理论、巩固所学知识并加深理解。 3. 对学生进行实验研究的基本训练。 二、实验内容和原理 实验一、 无符号数的词法分析程序(4 学时) 内容:掌握词法分析的基本思想,并用高级语言编写无符号数的词法分 析程序。 要求:从键盘上输入一串字符(包括字母、数字等),最后以“;”结束, 编写程序识别出其中的无符号数。 无符号数文法规则可定义如下: <无符号数>→<无符号实数>│<无符号整数> <无符号实数>→<无符号整数>.<数字串>[E<比例因子>]│ <无符号整数>E<比例因子> <比例因子>→<有符号整数> <有符号整数>→[+│-]<无符号整数> <无符号整数>→<数字串> <数字串>→<数字>{<数字>} <数字>→0 1 2 3...... 9 读无符号数的程序流程图见下图 2
开始 0=>w,p,j 1=>e Y 出错 N 数字否 Y 数值=〉d w*10+d=>w Y 取下一字符 数字否 Y N 是‘ .’否 取下一字符 数字否 N 出错 Y 数值=〉d w*10+d=>w j+1=>j Y 取下一字符 数字否 N Y 是‘E’否 取下一字符 N Y 是‘-’否 Y -1=>e 是‘E’否 N N 是‘+’否 Y 取下一字符 退一字符 N 数字否 N 出错 ‘整型’=〉 CJ1 Y 数值=〉d p*10+d=>p N Y 取下一字符 数字否 N 退一字符 ‘实型’=>CJ1 W*10C*P- J=>CJ2 出口 3 三、主要仪器设备
PC 机+Java 语言编程环境 四、实验结果与分析 1.实验代码: package text1; import java.io.BufferedReader; import java.io.InputStreamReader; 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++; 4
} 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 { 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; 5
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("您输入有误!"); } else { if (m[i] >= 48 && m[i] <= 57) { do { d = m[i] - 48; 6
" 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("您输入有误!"); } } } else { i++; if (m[i] >= 48 && m[i] <= 57) { do { d = m[i] - 48; w1 = w1 * 10 + d; // j = j + 1; i++; } while (m[i] >= 48 && m[i] <= 57); } else System.out.println("您输入有误!"); if (m[i] != 'E') { 7
System.out.println("小数为:" + w + '.' + w1); w = 0; w1 = 0; j = 0; } else if (m[i] == 'E') { i++; if (m[i] == '-') { e = -1; 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; 8
分享到:
收藏