2014-11-23 138 views
0

我正在開發自上而下的回溯解析器,但在導入語法時陷入困境。我的導師希望我們採取String[]並將其轉換爲char[][]將字符串轉換爲二維字符數組

例如,教師將在命令行中鍵入一個語法a a S b X a a S a X a S a X,我的程序應該把它放到一個2D char arrary中。

在輸入的X的應該代表|在語法,因此所得到的語法應該是

char[][] productions = new char[][] { {'a','a','S','b'}, 
             {'a','a','S','a'}, 
             {'a','S','a'}, 
             {'\0'} }; 

\0表示空字符串。下面的代碼生成char[4][],但我不確定如何爲每個單獨的生產製作陣列。

char[][] prod; int prodCount = 0, numProds = 0; 
    String[] input = new String[] {"a","a","S","b","X","a","a","S","a","X", 
            "a","S","a","X"}; 

    for(int i = 0; i < input.length; i++) { 
     if(input[i] == "X") 
      prodCount++; 
    } 

    prod = new char[prodCount][]; 

    for(int i = 0; i < prod.length; i++) { 
     for(int k = 0; k < input.length; k++) { 
      if(input[k] == "X") { 
       prod[i] = new char[numProds]; 
       numProds = 0; break; 
      } else 
       numProds++; 
     } 
    } 

    for(int i = 0; i < prod.length; i++) { 
     for(int j = 0; j < input.length; j++) { 
      if(input[j] == "X") break; 
      prod[i][j] = input[j].charAt(0); 
     } 
    } 

編輯: 我已經摸索出如何將語法轉換,但我堅持我如何能在我的二維數組涉及\0

char[][] prod; int prodCount = 0, numProds = 0; 
    String[] input = new String[] {"a","a","S","b","X", 
            "a","a","S","a","X", 
            "a","S","a","X"}; 

    for(int i = 0; i < input.length; i++) { 
     if(input[i] == "X") 
      prodCount++; 
    } 

    prod = new char[prodCount][]; 

    int current = 0; 
    for(int i = 0; i < input.length; i++) { 
     if(input[i] == "X") { 
      prod[current] = new char[numProds]; 
      current++; numProds = 0; 
     } else 
      numProds++; 
    } 

    int currentTerminal = 0; current = 0; 
    for(int i = 0; i < input.length; i++) { 
     if(input[i] == "X") { 
      currentTerminal = 0; 
      current++; 
     } 
     else { 
      prod[current][currentTerminal] = input[i].charAt(0); 
      currentTerminal++; 
     } 
    } 

回答

0

下面是一些簡單的代碼已經做了你需要的東西:

String grammar = "aaSbXaaSaXaSaX"; 
    String[] components = grammar.split("X"); 
    char[][] chars = new char[components.length + 1][]; 
    for (int i = 0; i < components.length; i++) { 
     String component = components[i]; 
     chars[i] = component.toCharArray(); 
    } 
    chars[components.length] = new char[] { '\0' }; 
+0

我甚至沒有想到'分裂()':P – Delfino 2014-11-23 23:13:00

+0

但是,我會用將導入爲語法一個'String []',所以我將無法使用'split()'。 – Delfino 2014-11-23 23:14:37