编译原理:实验一、无符号数的词法分析程序
内容:掌握词法分析的基本思想,并用高级语言编写无符号数的词法分析程 序。 内容:掌握词法分析的基本思想,并用高级语言编写无符号数的词法分析程 序。
要求:从键盘上输入一串字符(包括字母、数字等),最后以
“
;
”
结束,编写 要求:从键盘上输入一串字符(包括字母、数字等),最后以 “ ; ” 结束,编写
程序识别出其中的无符号数。 程序识别出其中的无符号数。
无符号数文法规则可定义如下: 无符号数文法规则可定义如下:
<
无符号数
>→<
无符号实数
>│<
无符号整数
> < 无符号数 >→< 无符号实数 >│< 无符号整数 >
<
无符号实数
>→<
无符号整数
>.<
数字串
>[E<
比例因子
>]│ < 无符号实数 >→< 无符号整数 >.< 数字串 >[E< 比例因子 >]│
<
无符号整数
>E<
比例因子
> < 无符号整数 >E< 比例因子 >
<
比例因子
>→<
有符号整数
> < 比例因子 >→< 有符号整数 >
<
有符号整数
>→[+│-]<
无符号整数
> < 有符号整数 >→[+│-]< 无符号整数 >
<
无符号整数
>→<
数字串
> < 无符号整数 >→< 数字串 >
<
数字串
>→<
数字
>{<
数字
>} < 数字串 >→< 数字 >{< 数字 >}
<
数字
>→0 1 2 3...... 9 < 数字 >→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); } } } } } } } }
实验结果:
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); } } } } } } } } 实验结果:上一篇:
多线程四大经典案例