2015-06-26 2 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

Смежные вопросы