Search in sources :

Example 11 with Token

use of uk.me.parabola.mkgmap.scan.Token in project mkgmap by openstreetmap.

the class RuleFileReader method readIf.

private boolean readIf(TokenScanner scanner, ExpressionReader expressionReader) {
    // Take the 'if' token
    Token tok = scanner.nextToken();
    scanner.skipSpace();
    // If 'if'' is being used as a keyword then it is followed by a '('.
    Token next = scanner.peekToken();
    if (next.getType() == TokType.SYMBOL && next.isValue("(")) {
        Op origExpr = expressionReader.readConditions();
        scanner.validateNext("then");
        // add rule expr { set <ifVar> = true }
        String ifVar = getNextIfVar();
        ArrayList<Action> actions = new ArrayList<>(1);
        actions.add(new AddTagAction(ifVar, "true", true));
        ActionList actionList = new ActionList(actions, Collections.singleton(ifVar + "=true"));
        saveRule(scanner, origExpr, actionList, null);
        // create expression (<ifVar> = true)
        EqualsOp safeExpr = new EqualsOp();
        safeExpr.setFirst(new GetTagFunction(ifVar));
        safeExpr.setSecond(new ValueOp("true"));
        Op[] ifExpressions = { origExpr, safeExpr };
        ifStack.addLast(ifExpressions);
        return true;
    } else {
        // Wrong syntax for if statement, so push back token to allow a possible expression to be read
        scanner.pushToken(tok);
    }
    return false;
}
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) EqualsOp(uk.me.parabola.mkgmap.osmstyle.eval.EqualsOp) DeleteAction(uk.me.parabola.mkgmap.osmstyle.actions.DeleteAction) AddTagAction(uk.me.parabola.mkgmap.osmstyle.actions.AddTagAction) Action(uk.me.parabola.mkgmap.osmstyle.actions.Action) AddTagAction(uk.me.parabola.mkgmap.osmstyle.actions.AddTagAction) ValueOp(uk.me.parabola.mkgmap.osmstyle.eval.ValueOp) ArrayList(java.util.ArrayList) GetTagFunction(uk.me.parabola.mkgmap.osmstyle.function.GetTagFunction) Token(uk.me.parabola.mkgmap.scan.Token) ActionList(uk.me.parabola.mkgmap.osmstyle.actions.ActionList)

Example 12 with Token

use of uk.me.parabola.mkgmap.scan.Token in project mkgmap by openstreetmap.

the class ActionReader method readActions.

public ActionList readActions() {
    List<Action> actions = new ArrayList<>();
    Set<String> changeableTags = new HashSet<>();
    scanner.skipSpace();
    if (!scanner.checkToken("{"))
        return new ActionList(actions, changeableTags);
    scanner.nextToken();
    while (inAction()) {
        Token tok = scanner.nextToken();
        if (tok.isValue(";"))
            continue;
        if (tok.isValue("'") || tok.isValue("\""))
            throw new SyntaxException(scanner, "quoted word found where command expected");
        String cmd = tok.getValue();
        if ("set".equals(cmd)) {
            actions.add(readTagValue(true, changeableTags));
        } else if ("add".equals(cmd)) {
            actions.add(readTagValue(false, changeableTags));
        } else if ("setaccess".equals(cmd)) {
            actions.add(readAccessValue(true, changeableTags));
        } else if ("addaccess".equals(cmd)) {
            actions.add(readAccessValue(false, changeableTags));
        } else if ("apply".equals(cmd)) {
            actions.add(readAllCmd(false));
        } else if ("apply_once".equals(cmd)) {
            actions.add(readAllCmd(true));
        } else if ("name".equals(cmd)) {
            actions.add(readValueBuilder(new NameAction()));
            changeableTags.add("mkgmap:label:1");
        } else if ("addlabel".equals(cmd)) {
            actions.add(readValueBuilder(new AddLabelAction()));
            for (int labelNo = 1; labelNo <= 4; labelNo++) changeableTags.add("mkgmap:label:" + labelNo);
        } else if ("delete".equals(cmd)) {
            String tag = scanner.nextWord();
            actions.add(new DeleteAction(tag));
        } else if ("deletealltags".equals(cmd)) {
            actions.add(new DeleteAllTagsAction());
        } else if ("rename".equals(cmd)) {
            String from = scanner.nextWord();
            String to = scanner.nextWord();
            Action act = new RenameAction(from, to);
            actions.add(act);
            // The 'to' tag may come into existence and you may attempt
            // to match on it, therefore we have to save it.
            changeableTags.add(to);
            // the from tag must not be dropped from the input
            usedTags.add(from);
        } else if ("echo".equals(cmd)) {
            String str = scanner.nextWord();
            actions.add(new EchoAction(str));
        } else if ("echotags".equals(cmd)) {
            String str = scanner.nextWord();
            actions.add(new EchoTagsAction(str));
        } else {
            throw new SyntaxException(scanner, "Unrecognised command '" + cmd + '\'');
        }
        scanner.skipSpace();
    }
    if (scanner.checkToken("}"))
        scanner.nextToken();
    scanner.skipSpace();
    return new ActionList(actions, changeableTags);
}
Also used : ArrayList(java.util.ArrayList) Token(uk.me.parabola.mkgmap.scan.Token) SyntaxException(uk.me.parabola.mkgmap.scan.SyntaxException) HashSet(java.util.HashSet)

Example 13 with Token

use of uk.me.parabola.mkgmap.scan.Token in project mkgmap by openstreetmap.

the class SrtTextReader method expandState.

/**
 * Within an 'expand' command. The whole command is read before return, they can not span
 * lines.
 *
 * @param tok The first token after the keyword.
 */
private void expandState(TokenScanner scanner, Token tok) {
    String val = tok.getValue();
    Code code = new Code(scanner, val).read();
    String s = scanner.nextValue();
    if (!s.equals("to"))
        throw new SyntaxException(scanner, "Expected the word 'to' in expand command");
    int secondary = 0;
    int tertiary = 0;
    int num = 0;
    while (!scanner.isEndOfFile()) {
        Token t = scanner.nextRawToken();
        if (t.isEol())
            break;
        if (t.isWhiteSpace())
            continue;
        Code r = new Code(scanner, t.getValue()).read();
        CodePosition cp = new CodePosition();
        int b = r.getBval();
        int primary = sort.getPrimary(b);
        cp.setPrimary((char) primary);
        // character so adjust the ordering at other strengths.  May need further tweaks.
        if (EXPERIMENTAL) {
            secondary = sort.getSecondary(b);
            tertiary = sort.getTertiary(b);
            if (num++ == 0) {
                Integer max = maxSec.get(primary);
                secondary += max == null ? 0 : max;
                if (charFlags(code) == 1) {
                    max = maxTert.get(primary);
                    tertiary += max == null ? 0 : max;
                }
            } else {
                secondary = 1;
            }
            cp.setSecondary((byte) (secondary));
            cp.setTertiary((byte) (tertiary));
        } else {
            num++;
            secondary = sort.getSecondary(b) & 0xff;
            cp.setSecondary((byte) (secondary + 7));
            tertiary = sort.getTertiary(b) & 0xff;
            cp.setTertiary((byte) (tertiary + 2));
        }
        expansions.add(cp);
    }
    int flags = charFlags(code) | (num - 1) << 4;
    sort.add(code.getBval(), expansions.size() - num + 1, 0, 0, flags);
    state = IN_INITIAL;
}
Also used : CodePosition(uk.me.parabola.imgfmt.app.srt.CodePosition) SyntaxException(uk.me.parabola.mkgmap.scan.SyntaxException) Token(uk.me.parabola.mkgmap.scan.Token)

Example 14 with Token

use of uk.me.parabola.mkgmap.scan.Token in project mkgmap by openstreetmap.

the class CommonSection method readColourInfo.

/**
 * Read the colour lines from the XPM format image.
 */
protected ColourInfo readColourInfo(TokenScanner scanner, String header) {
    ColourInfo colourInfo = new ColourInfo();
    parseXpmHeader(scanner, colourInfo, header);
    for (int i = 0; i < colourInfo.getNumberOfColours(); i++) {
        scanner.validateNext("\"");
        int cpp = colourInfo.getCharsPerPixel();
        Token token = scanner.nextRawToken();
        String colourTag = token.getValue();
        while (colourTag.length() < cpp) colourTag += scanner.nextRawToken().getValue();
        colourTag = colourTag.substring(0, cpp);
        scanner.validateNext("c");
        String colour = scanner.nextValue();
        if (colour.charAt(0) == '#') {
            colour = scanner.nextValue();
            colourInfo.addColour(colourTag, new Rgb(colour));
        } else if (colour.equalsIgnoreCase("none")) {
            colourInfo.addTransparent(colourTag);
        } else {
            throw new SyntaxException(scanner, "Unrecognised colour: " + colour);
        }
        scanner.validateNext("\"");
        readExtraColourInfo(scanner, colourInfo);
    }
    return colourInfo;
}
Also used : SyntaxException(uk.me.parabola.mkgmap.scan.SyntaxException) Token(uk.me.parabola.mkgmap.scan.Token) Rgb(uk.me.parabola.imgfmt.app.typ.Rgb) ColourInfo(uk.me.parabola.imgfmt.app.typ.ColourInfo)

Aggregations

Token (uk.me.parabola.mkgmap.scan.Token)14 SyntaxException (uk.me.parabola.mkgmap.scan.SyntaxException)8 TokenScanner (uk.me.parabola.mkgmap.scan.TokenScanner)4 BufferedReader (java.io.BufferedReader)2 ArrayList (java.util.ArrayList)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 File (java.io.File)1 FileNotFoundException (java.io.FileNotFoundException)1 HashSet (java.util.HashSet)1 CodePosition (uk.me.parabola.imgfmt.app.srt.CodePosition)1 ColourInfo (uk.me.parabola.imgfmt.app.typ.ColourInfo)1 Rgb (uk.me.parabola.imgfmt.app.typ.Rgb)1 Action (uk.me.parabola.mkgmap.osmstyle.actions.Action)1 ActionList (uk.me.parabola.mkgmap.osmstyle.actions.ActionList)1 AddTagAction (uk.me.parabola.mkgmap.osmstyle.actions.AddTagAction)1 DeleteAction (uk.me.parabola.mkgmap.osmstyle.actions.DeleteAction)1 GetTagFunction (uk.me.parabola.mkgmap.osmstyle.function.GetTagFunction)1