若已知运算符之间的优先关系,可按如下步骤构造优先函数:
1、对每个运算符a(包括#在内)令f(a)=g(a)=1
2、如果a⋗b且f(a)<=g(b)令f(a)=g(b)+1
3、如果a⋖b且f(a)>=g(b)令g(b)= f(a)+1
4、如果a≐b而f(a) ≠g(b),令min{f(a),g(b)}=max{f(a),g(b)}
5、重复2~4,直到过程收敛。如果重复过程中有一个值大于2n,则表明不存在算符优先函数。
1 import java.util.Scanner; 2 3 /** 4 * Created by redli on 2017/5/2. 5 * 6 * 样例输入1 7 * -------------------------------------------------- 8 请输入终结符(输入#号结束): 9 +*()i# 10 请输入关系矩阵(#号结束): 11 ><<><>><><<<<+<>>!>!>>!>!# 12 ----------------------------------------------------- 13 * 样例输入2 14 * -------------------------------------------------- 15 请输入终结符(输入#号结束): 16 abcd# 17 请输入关系矩阵(#号结束): 18 !!>>!!>!<=<!=!=!# 19 ----------------------------------------------------- 20 */ 21 public class Floyd { 22 public static Scanner in = new Scanner(System.in); 23 public static StringBuffer terminal = new StringBuffer(); 24 public static StringBuffer matrix = new StringBuffer(); 25 public static void main(String args[]){ 26 //输入 27 Input input = new Input(); 28 input.inputTerminal(); 29 input.inputMatrix(); 30 31 //优先函数 32 PriorityFunction priority_function = new PriorityFunction(); 33 priority_function.makePriorityFunction(); 34 priority_function.createPriorityFunction(); 35 priority_function.outPriorityFunction(); 36 } 37 38 private static class Input{ 39 //输入终结符 40 public void inputTerminal(){ 41 System.out.println("请输入终结符(输入#号结束):"); 42 String str = in.next(); 43 while(!str.equals("#")){ 44 if(str.substring(str.length()-1).equals("#")){ 45 terminal.append(str.substring(0,str.length()-1)); 46 str = "#"; 47 } else{ 48 terminal.append(str); 49 str = in.next(); 50 } 51 } 52 } 53 54 /* 55 * 输入关系矩阵 56 * 输入>,<,=,!(表示为空) 57 * */ 58 public void inputMatrix(){ 59 System.out.println("请输入关系矩阵(#号结束):"); 60 String str = in.next(); 61 while(!(str.equals("#"))){ 62 if(!(str.substring(str.length()-1).equals("#"))){ 63 matrix.append(str); 64 str = in.next(); 65 } else{ 66 matrix.append(str.substring(0,str.length()-1)); 67 str = "#"; 68 } 69 } 70 } 71 } 72 73 /* 74 * 优先函数处理类 75 * */ 76 private static class PriorityFunction{ 77 int num = terminal.length(); 78 int [][] arr = new int[2][num]; 79 /* 80 * 构造优先函数,赋初值1 81 * */ 82 public void makePriorityFunction(){ 83 for(int i=0; i<2; i++){ 84 for(int j=0;j<num;j++){ 85 arr[i][j] = 1; 86 } 87 } 88 } 89 90 /* 91 * 92 * 生成优先函数 93 * 94 * */ 95 public void createPriorityFunction(){ 96 int k=1; 97 int terLength = terminal.length(); 98 while(k!=0){ 99 k = 0; 100 for(int i=0; i<terminal.length();i++){ 101 for(int j=0; j<terminal.length(); j++){ 102 if(Character.toString(matrix.charAt(i*terLength+j)).equals(">") && arr[0][i]<=arr[1][j]){ 103 arr[0][i]=arr[1][j]+1; 104 k=1; 105 } else if(Character.toString(matrix.charAt(i*terLength+j)).equals("<") && arr[0][i]>=arr[1][j]){ 106 arr[1][j]=arr[0][i]+1; 107 k=1; 108 } 109 } 110 } 111 } 112 } 113 114 /* 115 * 输出优先函数 116 * */ 117 public void outPriorityFunction(){ 118 for(int k=0; k<terminal.length(); k++){ 119 System.out.print(terminal.charAt(k)+" "); 120 } 121 System.out.println(); 122 for(int i=0; i<2; i++){ 123 for(int j=0; j<terminal.length();j++){ 124 System.out.print(arr[i][j]+" "); 125 } 126 System.out.print("\n"); 127 } 128 } 129 } 130 }
浙公网安备 33010602011771号