1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package ch.qos.cal10n.util;
23
24 import java.io.Reader;
25 import java.util.List;
26 import java.util.Map;
27
28
29
30
31
32
33
34 import ch.qos.cal10n.util.Token.TokenType;
35
36
37
38
39
40
41
42
43
44 public class Parser {
45
46 final Reader reader;
47 final Map<String, String> map;
48
49 List<Token> tokenList;
50 int pointer = 0;
51
52 Parser(Reader r, Map<String, String> map) {
53 this.reader = r;
54 this.map = map;
55 TokenStream ts = new TokenStream(reader);
56 tokenList = ts.tokenize();
57 }
58
59 void parseAndPopulate() {
60 E();
61 }
62
63 private void E() {
64 Token t = getNextToken();
65 if (t == null) {
66
67 return;
68 }
69 switch (t.tokenType) {
70 case EOL:
71 break;
72 case KEY:
73 String k = t.getValue();
74 t = getNextToken();
75 if (t.tokenType != TokenType.SEPARATOR) {
76 throw new IllegalStateException("Unexpected token " + t);
77 }
78 StringBuilder buf = new StringBuilder();
79 V(buf);
80 map.put(k, buf.toString());
81 break;
82 }
83 E();
84 }
85
86
87
88 private void V(StringBuilder buf) {
89
90 Token t = getNextToken();
91 if (t.tokenType != TokenType.VALUE) {
92 throw new IllegalStateException("Unexpected token " + t);
93 }
94 buf.append(t.getValue());
95
96 t = getNextToken();
97 if (t.tokenType == TokenType.EOL) {
98 return;
99 } else if (t.tokenType == TokenType.TRAILING_BACKSLASH) {
100 Vopt(buf);
101
102 }
103 }
104
105 private void Vopt(StringBuilder buf) {
106 Token t = getNextToken();
107 if (t.tokenType != TokenType.EOL) {
108 throw new IllegalStateException("Unexpected token " + t);
109 }
110 V(buf);
111 }
112
113 private Token getNextToken() {
114 if (pointer < tokenList.size()) {
115 return (Token) tokenList.get(pointer++);
116 }
117 return null;
118 }
119
120
121
122
123
124
125
126
127
128
129
130 }