本科实验报告
课程名称:
编译原理
实验项目:无符号数的词法分析程序(实验一)
实验地点:
计算机学院软件实验室
专业班级:
学号:
学生姓名:
指导教师:
冯秀芳
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