4 * base class for parsing segments of token array..
7 * We want to make parsing the whole thing easy..
9 * so we do various tricks:
12 * a) white space collased
15 * { } - collapse into first element.
16 ( ) - collapse into first element.
17 [ ] - collapse into first element.
18 * c) items = , seperation within the above..
20 * usage: x = new Collapse(token_array)
29 public class Collapse : TokenStream {
34 public Collapse(Gee.ArrayList<Token> tokens, Packer pk, string filename)
39 this.filename = filename;
45 var ar = this.collapse(this.tokens);
53 // put spaces into prefix of tokens..
57 var ar = new Gee.ArrayList<Token>();
58 var pref = new Gee.ArrayList<Token>();
62 for (var i = 0; i < this.tokens.size; i ++) {
63 var tok = this.tokens[i];
64 if (tok.isType(TokenType.COMM) || tok.isType(TokenType.WHIT)) {
70 foreach(var e in pref) {
73 pref = new Gee.ArrayList<Token>(); // reset pref..
87 Gee.ArrayList<Token> collapse(Gee.ArrayList<Token> ar)
90 var st = new TokenStream(ar);
91 var ret = new Gee.ArrayList<Token>();
92 var last_is_object_def = false;
95 var tok = st.look(1,true);
97 // Seed.print(TokenStream.toString(ret));
100 // console.log(tok.data);
102 //print("COL: %s\n", tok.asString());
115 if (last_is_object_def) {
117 this.packer.logError(Packer.ResultType.err, this.filename, tok.line,
118 "Syntax error - found non punctuation after object close brace");
122 //GLib.error("Syntax error - found non punctuation after object close brace\n%s", tok.asString());
129 last_is_object_def = false;
137 last_is_object_def = false;
138 var start = st.cursor;
139 //st.next(); << no need to shift, balance will start at first character..
141 var add = st.balance(tok.name);
143 // print("BALANCE returned %d items\n", add.size);
148 //console.dump(start + '...' + st.cursor);
149 //console.dump(st.tokens);
153 add.remove_at(0); // remove the first element... (as it's the
156 //Seed.print(JSON.stringify(add, null,4));
160 var toks = add.size > 0 ? this.collapse(add) : add;
162 tok.items = new Gee.ArrayList<Gee.ArrayList<Token>>(); //?? needed?
163 tok.props = new Gee.HashMap<string,TokenKeyMap>();
166 if (tok.data != "{") {
167 // paramters or array elements..
168 tok.items = this.toItems(toks, ",");
169 if (tok.data == "]") { // ) can be folowed with lots of things...
170 last_is_object_def = true;
173 // check for types.. it could be a list of statements.. or object
174 // format "{" "xXXX" ":" << looks for the ':'.. seems to work.. not sure if it's foolproof...
176 var ost = new TokenStream(toks);
177 //console.dump(ost.look(2,true) );
178 if (ost.look(2,true) != null && ost.look(2,true).data == ":") {
179 // object properties...
180 this.toProps(toks,tok);
181 last_is_object_def = true;
183 // list of statemetns..
184 tok.items = this.toItems(toks, ";{");;
196 //Seed.print(" ADD : " + add.length + " ITEMS: " + tok.items.length);
203 last_is_object_def = false;
210 print("OOPS" + tok.type.to_string());
225 // array of arrays of tokens
226 Gee.ArrayList<Gee.ArrayList<Token>> toItems(Gee.ArrayList<Token> ar, string sep)
228 var ret = new Gee.ArrayList<Gee.ArrayList<Token>>() ;
229 var g = new Gee.ArrayList<Token>() ;
231 for (var i = 0; i < ar.size; i ++) {
232 if (sep.index_of(ar.get(i).data) < 0) {
237 if ((ar.get(i).data != ";") && g.size> 0 && (g[0].name == TokenName.VAR)) {;
244 g = new Gee.ArrayList<Token>() ;
255 Gee.HashMap<string,TokenKeyMap> toProps (Gee.ArrayList<Token> ar, Token tok)
258 var ret = new Gee.HashMap<string,TokenKeyMap>();
260 var keyseq = new Gee.ArrayList<string>();
262 var g = new TokenKeyMap();
267 for (var i = 0; i < ar.size; i ++) {
277 state =2; // should be ':'
280 g.vals.add( ar.get(i));
281 if ( ar.get(i).data != ",") {
285 g = new TokenKeyMap();
291 // last.. - if g.val.length is 0 then it's a trailing ','...
292 // we should really throw a syntax error in that case..
293 if (k.length > 0 && g.vals.size > 0) {