若已知运算符之间的优先关系,可按如下步骤构造优先函数:

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 }