Search in sources :

Example 1 with ExpressionReader

use of uk.me.parabola.mkgmap.osmstyle.eval.ExpressionReader in project mkgmap by openstreetmap.

the class RuleFileReader method loadFile.

/**
 * Load a rules file.  This should be used when calling recursively when including
 * files.
 */
private void loadFile(StyleFileLoader loader, String name) throws FileNotFoundException {
    Reader r = loader.open(name);
    TokenScanner scanner = new TokenScanner(name, r);
    scanner.setExtraWordChars("-:.");
    ExpressionReader expressionReader = new ExpressionReader(scanner, kind);
    ActionReader actionReader = new ActionReader(scanner);
    // Read all the rules in the file.
    scanner.skipSpace();
    while (!scanner.isEndOfFile()) {
        if (checkCommand(loader, scanner, expressionReader))
            continue;
        if (scanner.isEndOfFile())
            break;
        Op expr = expressionReader.readConditions(ifStack);
        expr = arranger.arrange(expr);
        ActionList actionList = actionReader.readActions();
        checkIfStack(actionList);
        if (performChecks && this.kind == FeatureKind.RELATION) {
            String actionsString = actionList.getList().toString();
            if (actionsString.contains("set mkgmap:stylefilter") || actionsString.contains("add mkgmap:stylefilter")) {
                log.error("Style file", name, "should not set or add the special tag mkgmap:stylefilter:", actionsString);
            }
        }
        List<GType> types = new ArrayList<>();
        while (scanner.checkToken("[")) {
            GType type = typeReader.readType(scanner, performChecks, overlays);
            types.add(type);
            scanner.skipSpace();
        }
        // If there is an action list, then we don't need a type
        if (types.isEmpty() && actionList.isEmpty())
            throw new SyntaxException(scanner, "No type definition given");
        if (types.isEmpty())
            saveRule(scanner, expr, actionList, null);
        if (types.size() >= 2 && actionList.isModifyingTags()) {
            throw new SyntaxException(scanner, "Combination of multiple type definitions with tag modifying action is not yet supported.");
        }
        for (int i = 0; i < types.size(); i++) {
            GType type = types.get(i);
            if (i + 1 < types.size()) {
                type.setContinueSearch(true);
            }
            // No need to create a deep copy of expr
            saveRule(scanner, expr, actionList, type);
            actionList = new ActionList(Collections.emptyList(), Collections.emptySet());
        }
    }
    rules.addUsedTags(expressionReader.getUsedTags());
    rules.addUsedTags(actionReader.getUsedTags());
}
Also used : Op(uk.me.parabola.mkgmap.osmstyle.eval.Op) ValueOp(uk.me.parabola.mkgmap.osmstyle.eval.ValueOp) EqualsOp(uk.me.parabola.mkgmap.osmstyle.eval.EqualsOp) NotOp(uk.me.parabola.mkgmap.osmstyle.eval.NotOp) GType(uk.me.parabola.mkgmap.reader.osm.GType) TokenScanner(uk.me.parabola.mkgmap.scan.TokenScanner) ActionReader(uk.me.parabola.mkgmap.osmstyle.actions.ActionReader) SyntaxException(uk.me.parabola.mkgmap.scan.SyntaxException) ArrayList(java.util.ArrayList) ActionReader(uk.me.parabola.mkgmap.osmstyle.actions.ActionReader) Reader(java.io.Reader) ExpressionReader(uk.me.parabola.mkgmap.osmstyle.eval.ExpressionReader) ActionList(uk.me.parabola.mkgmap.osmstyle.actions.ActionList) ExpressionReader(uk.me.parabola.mkgmap.osmstyle.eval.ExpressionReader)

Example 2 with ExpressionReader

use of uk.me.parabola.mkgmap.osmstyle.eval.ExpressionReader in project mkgmap by openstreetmap.

the class ExpressionArrangerTest method createOp.

private Op createOp(String s) {
    TokenScanner scanner = new TokenScanner("test.file", new StringReader(s));
    ExpressionReader er = new ExpressionReader(scanner, FeatureKind.POLYLINE);
    return er.readConditions();
}
Also used : TokenScanner(uk.me.parabola.mkgmap.scan.TokenScanner) StringReader(java.io.StringReader) ExpressionReader(uk.me.parabola.mkgmap.osmstyle.eval.ExpressionReader)

Example 3 with ExpressionReader

use of uk.me.parabola.mkgmap.osmstyle.eval.ExpressionReader in project mkgmap by openstreetmap.

the class RulesTest method runArrangeTest.

private boolean runArrangeTest(String rule, int id) {
    TokenScanner scanner = new TokenScanner("test.file", new StringReader(rule));
    ExpressionReader er = new ExpressionReader(scanner, FeatureKind.POLYLINE);
    Op op = er.readConditions();
    boolean[] orig = evalWays(op);
    Op result = arranger.arrange(op);
    if (!isSolved(result))
        throw new SyntaxException("Could not solve rule expression: best attempt was " + fmtExpr(result));
    boolean[] after = evalWays(result);
    boolean ok = Arrays.equals(after, orig);
    if (ok) {
        if (!onlyErrors)
            System.out.println("OK: " + rule);
    } else {
        System.out.println("ERROR: FAILED test: " + rule);
        System.out.println("  new expr: " + op);
        for (int i = 0; i < orig.length; i++) {
            if (orig[i] != after[i]) {
                System.out.println("  way " + testWays.get(i) + ", orig=" + orig[i] + ", arranged=" + after[i]);
            }
        }
        checkStopOnFail();
    }
    return ok;
}
Also used : NotExistsOp(uk.me.parabola.mkgmap.osmstyle.eval.NotExistsOp) Op(uk.me.parabola.mkgmap.osmstyle.eval.Op) GTEOp(uk.me.parabola.mkgmap.osmstyle.eval.GTEOp) LTOp(uk.me.parabola.mkgmap.osmstyle.eval.LTOp) NotEqualOp(uk.me.parabola.mkgmap.osmstyle.eval.NotEqualOp) BinaryOp(uk.me.parabola.mkgmap.osmstyle.eval.BinaryOp) OrOp(uk.me.parabola.mkgmap.osmstyle.eval.OrOp) NotOp(uk.me.parabola.mkgmap.osmstyle.eval.NotOp) ValueOp(uk.me.parabola.mkgmap.osmstyle.eval.ValueOp) EqualsOp(uk.me.parabola.mkgmap.osmstyle.eval.EqualsOp) RegexOp(uk.me.parabola.mkgmap.osmstyle.eval.RegexOp) ExistsOp(uk.me.parabola.mkgmap.osmstyle.eval.ExistsOp) AndOp(uk.me.parabola.mkgmap.osmstyle.eval.AndOp) TokenScanner(uk.me.parabola.mkgmap.scan.TokenScanner) SyntaxException(uk.me.parabola.mkgmap.scan.SyntaxException) StringReader(java.io.StringReader) ExpressionReader(uk.me.parabola.mkgmap.osmstyle.eval.ExpressionReader)

Aggregations

ExpressionReader (uk.me.parabola.mkgmap.osmstyle.eval.ExpressionReader)3 TokenScanner (uk.me.parabola.mkgmap.scan.TokenScanner)3 StringReader (java.io.StringReader)2 EqualsOp (uk.me.parabola.mkgmap.osmstyle.eval.EqualsOp)2 NotOp (uk.me.parabola.mkgmap.osmstyle.eval.NotOp)2 Op (uk.me.parabola.mkgmap.osmstyle.eval.Op)2 ValueOp (uk.me.parabola.mkgmap.osmstyle.eval.ValueOp)2 SyntaxException (uk.me.parabola.mkgmap.scan.SyntaxException)2 Reader (java.io.Reader)1 ArrayList (java.util.ArrayList)1 ActionList (uk.me.parabola.mkgmap.osmstyle.actions.ActionList)1 ActionReader (uk.me.parabola.mkgmap.osmstyle.actions.ActionReader)1 AndOp (uk.me.parabola.mkgmap.osmstyle.eval.AndOp)1 BinaryOp (uk.me.parabola.mkgmap.osmstyle.eval.BinaryOp)1 ExistsOp (uk.me.parabola.mkgmap.osmstyle.eval.ExistsOp)1 GTEOp (uk.me.parabola.mkgmap.osmstyle.eval.GTEOp)1 LTOp (uk.me.parabola.mkgmap.osmstyle.eval.LTOp)1 NotEqualOp (uk.me.parabola.mkgmap.osmstyle.eval.NotEqualOp)1 NotExistsOp (uk.me.parabola.mkgmap.osmstyle.eval.NotExistsOp)1 OrOp (uk.me.parabola.mkgmap.osmstyle.eval.OrOp)1