2015-06-26 19 views
0

請幫我如何將字符串變成一個集指揮lines.Please的考慮下面的代碼:如何改變S帶入組命令行

public class TestStringCommand{ 

    public static void main(String[] args) { 
     System.out.println("Change String to Command"); 

     int a , b, c; 
     String S = "a =1 ; b =2; c = a + b;"; 
     //How to change S into a set of command lines 
    // c will be 3 

    } 
} 

回答

0

一般來說,如果它僅僅是這些變量和除此之外,你可以擺脫所有的空白並開啓字符。

int a, b, c; Pattern integer = Pattern.compile("-?\\d+"); //fields 

主:

String input = ... ; 
String statements = input.replaceAll("\\s+",""); //remove the white space 
int next_statement_start, current_stmnt_start = 0; 
while (! statements.isEmpty()) { 
     //^ while we have more statements to process 
     next_statement_start = statements.indexOf(';') + 1; 
     String statement = statments.substr(current_stmnt_start, next_statement_start); 

     processStatement(statement); 

     current_stmnt_start = next_statement_start; 
     next_statement_start = statements.indexOf(';', next_statement_start) + 1 
} 

processStatement:

String[] parts = stmnt.split("="); 
if (parts.length != 2) throw new IllegalArgumentException(...); 
int val = evaluateExpression(parts[1].substr(0, parts[1].length()-1)); //remove the ';' 
setVar(parts[0], val); 

SETVAR:

switch (var) { 
    case "a": a = val; break; 
    case "b": b = val; break; 
    ... 
    default: 
     throw new IllegalArgumentException(...); 
} 

getVar:

switch (var) { 
    case "a": return a; 
    case "b": return b; 
    ... 
    default: 
     throw new IllegalArgumentException (...) 
} 

evaluateExpression:

if (expr.isEmpty()) throw new ...; 
int sum = 0; Matcher m = integer.matcher(""); 
for (String part : expr.split("+")) { 
    if (m.reset(part).matches()) { 
     sum += Integer.parseInt(part); 
    } else { 
     sum += getVar(part); 
    } 
} 
return sum; 

我還沒有嘗試編譯上面的代碼,但是這就是這個想法。你也可以使用reflection這雖然強大,通常不是正確的路。

或者這是你想要的嗎? https://en.wikipedia.org/wiki/Recursive_descent_parser

或者這是你真正需要的嗎? https://docs.oracle.com/javase/tutorial/essential/environment/properties.html