2
* Copyright (C) 2008 Steve Ratcliffe
4
* This program is free software; you can redistribute it and/or modify
5
* it under the terms of the GNU General Public License version 2 as
6
* published by the Free Software Foundation.
8
* This program is distributed in the hope that it will be useful,
9
* but WITHOUT ANY WARRANTY; without even the implied warranty of
10
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
* GNU General Public License for more details.
14
* Author: Steve Ratcliffe
15
* Create date: 16-Nov-2008
17
package uk.me.parabola.mkgmap.osmstyle.actions;
19
import java.util.ArrayList;
20
import java.util.List;
22
import uk.me.parabola.mkgmap.osmstyle.eval.SyntaxException;
23
import uk.me.parabola.mkgmap.scan.Token;
24
import uk.me.parabola.mkgmap.scan.TokenScanner;
27
* Read an action block. This is contained within braces and contains
28
* commands to change tags etc.
30
* @author Steve Ratcliffe
32
public class ActionReader {
33
private final TokenScanner scanner;
35
public ActionReader(TokenScanner scanner) {
36
this.scanner = scanner;
39
public List<Action> readActions() {
40
List<Action> actions = new ArrayList<Action>();
42
if (!scanner.checkToken("{"))
48
Token tok = scanner.nextToken();
52
String cmd = tok.getValue();
53
if ("set".equals(cmd)) {
54
actions.add(readTagValue(true));
55
} else if ("add".equals(cmd)) {
56
actions.add(readTagValue(false));
57
} else if ("apply".equals(cmd)) {
58
actions.add(readAllCmd());
59
} else if ("name".equals(cmd)) {
60
actions.add(readNameCmd());
61
} else if ("delete".equals(cmd)) {
62
String tag = scanner.nextWord();
63
actions.add(new DeleteAction(tag));
64
} else if ("rename".equals(cmd)) {
65
String from = scanner.nextWord();
66
String to = scanner.nextWord();
67
Action act = new RenameAction(from, to);
70
throw new SyntaxException(scanner, "Unrecognised command '" + cmd + '\'');
75
if (scanner.checkToken("}"))
81
private Action readAllCmd() {
83
if (scanner.checkToken("role")) {
85
String eq = scanner.nextValue();
87
throw new SyntaxException(scanner, "Expecting '=' after role keyword");
88
role = scanner.nextWord();
90
SubAction subAction = new SubAction(role);
92
List<Action> actionList = readActions();
93
for (Action a : actionList)
100
* A name command has a number of alternatives separated by '|' characters.
102
private Action readNameCmd() {
103
NameAction nameAct = new NameAction();
104
while (inActionCmd()) {
105
if (scanner.checkToken("|")) {
109
String val = scanner.nextWord();
115
private AddTagAction readTagValue(boolean modify) {
116
String key = scanner.nextWord();
117
if (!scanner.checkToken("="))
118
throw new SyntaxException(scanner, "Expecting tag=value");
120
String val = scanner.nextWord();
122
return new AddTagAction(key, val, modify);
125
private boolean inActionCmd() {
126
boolean end = scanner.checkToken(";");
127
return inAction() && !end;
130
private boolean inAction() {
131
return !scanner.isEndOfFile() && !scanner.checkToken("}");