package de.bse.prgm.parse.relational;
import de.bse.prgm.parse.arithmetical.ArithmeticalParser;
import de.bse.util.Finder;
import de.bse.vm.Machine;
import de.bse.vm.var.IVariable;
import java.util.HashMap;
import java.util.Map;
/**
* Parser which can parse relational terms
* @author Elias Groll
* @version 2.15
*/
public class RelationParser {
private static Map<String, Relation> knownOperators = null;
/**
* Constructs a new RelationParser.
*/
public RelationParser() {
knownOperators = new HashMap<String, Relation>();
knownOperators.put("=", new Equivalence());
knownOperators.put(">", new Greater());
knownOperators.put("<", new Less());
knownOperators.put(">=", new GreaterOrEqual());
knownOperators.put("<=", new LessOrEqual());
knownOperators.put("!=", new InEquivalence());
}
/**
* Parses a relational operation based on a given machine.
* @param operation to be parsed
* @param machine on which the operation shall be parsed
* @return the result of the relational operation
*/
public IVariable parseRelationalOperation(String operation, Machine machine) {
// only one relational operator allowed
Finder finder = findNextRelationalOperator(operation);
ArithmeticalParser psr1 = new ArithmeticalParser();
ArithmeticalParser psr2 = new ArithmeticalParser();
if (finder != null) {
Relation relation;
String left = operation.substring(0, finder.beginIndex).trim();
String right = operation.substring(finder.endIndex, operation.length())
.trim();
relation = knownOperators.get(operation.substring(finder.beginIndex,
finder.endIndex));
relation.init(psr1.parseArithmeticalOperation(left, machine),
psr2.parseArithmeticalOperation(right, machine));
return relation;
} else {
return psr1.parseArithmeticalOperation(operation, machine);
}
}
private Finder findNextRelationalOperator(String string) throws RuntimeException {
Finder retVal = null;
int ambigous = 0;
String tmp = string;
for (String operator : knownOperators.keySet()) {
if (tmp.contains(operator)) {
ambigous++;
retVal = new Finder(tmp.indexOf(operator), tmp.indexOf(operator)
+ operator.length());
tmp = tmp.substring(0, tmp.indexOf(operator))
+ tmp.substring(tmp.indexOf(operator) + operator.length(),
tmp.length());
}
}
if (ambigous > 1) {
throw new RuntimeException("ambigous op");
}
return retVal;
}
}