2014-11-23 195 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

相关问题