内容:掌握词法分析的基本思想,并用高级语言编写无符号数的词法分析程 序。
要求:从键盘上输入一串字符(包括字母、数字等),最后以
“
;
”
结束,编写
程序识别出其中的无符号数。
无符号数文法规则可定义如下:
<
无符号数
>→<
无符号实数
>│<
无符号整数
>
<
无符号实数
>→<
无符号整数
>.<
数字串
>[E<
比例因子
>]│
<
无符号整数
>E<
比例因子
>
<
比例因子
>→<
有符号整数
>
<
有符号整数
>→[+│-]<
无符号整数
>
<
无符号整数
>→<
数字串
>
<
数字串
>→<
数字
>{<
数字
>}
<
数字
>→0 1 2 3...... 9
读无符号数的程序流程图见下图
代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class 无符号数的词法分析程序 {
public static void main(String[] args) throws IOException {
fun();
}
public static void fun() throws IOException{
System.out.print("输入符号串:(最后以\";\"结束):");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String strings = br.readLine();
if (strings.length() == 0 || strings == null) {
System.out.println("error!");
return;
} else {
int w = 0; // 尾数累加器
int p = 0; // 指数累加器
int j = 0; // 十进制小数位数计数器
int e = 1; // 记录十进制数的符号
String CJ1; //记录类型
float Cj2;
for (int i = 0; i < strings.length(); i++) {
char ch = strings.charAt(i);
int d;
if (i == 0) {
if (ch > 48 && ch < 58) { //数字 1-9
d = ch - 48; //数值 => d
w = w * 10 + d; //w*10+d=>w
} else {
System.out.println("error!");
return;
}
} else {
if (ch > 47 && ch < 58) { //数字 0-9
d = ch - 48; //数值 => d
w = w * 10 + d; //w*10+d=>w
} else {
if (ch == '.') { //是否是小数点
i++;
ch = strings.charAt(i); //取下一个字符
if (ch < 48 || ch > 58){ //不是数字
System.out.println("error!");
return;
} else { //数字 0-9
do{
d = ch - 48; //数值 => d
w = w * 10 + d; //w*10+d=>w
j += 1; //j+1=>j
i++;
ch = strings.charAt(i); //取下一个字符
} while (ch > 47 && ch < 58);
if (ch == 'E') { //是'E'否
i++;
ch = strings.charAt(i); //取下一个字符
if (ch == '-') { //是'-'否
e = -1;
i++;
ch = strings.charAt(i); //取下一个字符
}else if (ch == '+') { //是'+'否
i++;
ch = strings.charAt(i); //取下一个字符
}
if (ch < 48 || ch > 58){ //不是数字
System.out.println("error!");
return;
} else {
do{
d = ch - 48; //数值 => d
p = p * 10 + d; //p*10+d=>p
i++;
ch = strings.charAt(i); //取下一个字符
} while (ch > 47 && ch < 58);
CJ1 = "实型";
Cj2 = (float) (w * Math.pow(10.0, e * p - j));
System.out.println(CJ1 +"_"+Cj2);
return;
}
} else {
CJ1 = "实型";
Cj2 = (float) (w * Math.pow(10.0, e * p - j));
System.out.println(CJ1 +"_"+Cj2);
return;
}
}
} else {
if (ch == 'E') { //是否是E
i++;
ch = strings.charAt(i); //取下一个字符
if (ch == '-') { //是'-'否
e = -1;
i++;
ch = strings.charAt(i); //取下一个字符
}else if (ch == '+') { //是'+'否
i++;
ch = strings.charAt(i); //取下一个字符
}
if (ch < 48 || ch > 58){ //不是数字
System.out.println("error!");
return;
} else {
do{
d = ch - 48; //数值 => d
p = p * 10 + d; //p*10+d=>p
i++;
ch = strings.charAt(i); //取下一个字符
} while (ch > 47 && ch < 58);
CJ1 = "实型";
Cj2 = (float) (w * Math.pow(10.0, e * p - j));
System.out.println(CJ1 +"_"+Cj2);
return;
}
} else {
CJ1 = "整型";
Cj2 = (float) (w * Math.pow(10.0, e * p - j));
System.out.println(CJ1 +"_"+Cj2);
}
}
}
}
}
}
}
}
实验结果: