@Override public ParseToken parseToken(String expression, Parser parser) { if (!canParse(expression)) return null; expression = expression.replace("--", "+"); if (c == ' ' && indicesLevel == 0) continue; if (c == operatorSymbol && level == 0 && testOperator(expressionChars, i)) { String toParse = buffer.toString(); if (!toParse.isEmpty()) modeParser(toParse, mode, parser, nodes); buffer = new StringBuffer(); mode = Mode.Direct; String toParse = buffer.toString(); if (!toParse.isEmpty()) modeParser(toParse, mode, parser, nodes); buffer = new StringBuffer(); mode = Mode.Inverse; buffer.append(c); modeParser(buffer.toString(), mode, parser, nodes); return compile(nodes);
private void modeParser(String expression, Mode mode, Parser parser, List<ParseToken> nodes) { if (mode == Mode.Direct) { nodes.add(parser.parse(expression)); return; } if (mode == Mode.Inverse) nodes.add(inverseOperation(parser.parse(expression))); else throw new ParserException("unrepoted operator parser mode"); }
protected final boolean canParse(String expression) { char[] expressionChars = expression.toCharArray(); int level = 0; char c; for (int i = 0; i < expressionChars.length; ++i) { c = expressionChars[i]; if (c == '(' || c == '[') level++; if (c == ')' || c == ']') level--; if (level < 0) throw new BracketsError(); if (c == operatorSymbol && level == 0 && testOperator(expressionChars, i)) return true; if (c == operatorInverseSymbol && level == 0) return true; } return false; }
@Override public ParseToken parseToken(String expression, Parser parser) { ParseToken node = super.parseToken(expression, parser); if (node == null || !parser.isAllowSameVariance()) return node; TIntHashSet indices = new TIntHashSet(); for (ParseToken c : node.content) { Indices free = c.getIndices().getFree(); for (int i = 0; i < free.size(); i++) { int ind = free.get(i); if (indices.contains(ind)) revertIndex(c, ind); else indices.add(ind); } } return node; }