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 {
32 public Collapse(Gee.ArrayList<Token> tokens)
38 ar = this.collapse(this.tokens);
46 // put spaces into prefix of tokens..
50 var ar = new Gee.ArrayList<Token>();
51 var pref = new Gee.ArrayList<Token>();
55 for (var i = 0; i < this.tokens.size; i ++) {
56 var tok = this.tokens[i];
57 if (tok.is("COMM") || tok.is("WHIT")) {
63 foreach(var e in pref) {
66 pref = new Gee.ArrayList<Token>(); // reset pref..
80 Gee.ArrayList<Token> collapse(Gee.ArrayList<Token> ar)
83 var st = new TokenStream(ar);
84 var ret = new Gee.ArrayList<Token>();
87 var tok = st.look(1,true);
89 // Seed.print(TokenStream.toString(ret));
92 // console.log(tok.data);
105 ret.push(st.next(1));
114 var start = st.cursor;
116 var add = st.balance(tok.data);
119 //console.dump(start + '...' + st.cursor);
120 //console.dump(st.tokens);
124 add.remove_at(0); // remove the first element... (as it's the
127 //Seed.print(JSON.stringify(add, null,4));
131 var toks = add.size > 0 ? this.collapse(add) : add;
133 tok.items = new Gee.ArrayList<Token>(); //?? needed?
134 tok.props = new Gee.HashMap<string,Gee.ArrayList<Token>>();
137 if (tok.data != "{") {
138 // paramters or array elements..
139 tok.items = this.toItems(toks, ",");
141 // check for types.. it could be a list of statements.. or object
142 // format "{" "xXXX" ":" << looks for the ':'.. seems to work.. not sure if it's foolproof...
144 var ost = new TokenStream(toks);
145 //console.dump(ost.look(2,true) );
146 if (ost.look(2,true) && ost.look(2,true).data == ":") {
147 // object properties...
148 tok.props = this.toProps(toks);
150 // list of statemetns..
151 tok.items = this.toItems(toks, ";{");;
163 //Seed.print(" ADD : " + add.length + " ITEMS: " + tok.items.length);
170 ret.push(st.next(1));
176 Seed.print("OOPS" + tok.type);
191 Gee.ArrayList<Gee.ArrayList<Token>> toItems(Gee.ArrayList<Token> ar, string sep)
193 var ret = new Gee.ArrayList<Gee.ArrayList<Token>>() ;
194 var g = new Gee.ArrayList<Token>() ;
196 for (var i = 0; i < ar.length; i ++) {
197 if (sep.index_of(ar.get(i).data) < 0) {
202 if ((ar.get(i).data != ";") && g.size> 0 && (g[0].name == "VAR")) {;
209 g = new Gee.ArrayList<Token>() ;
219 toProps : function(ar)
224 var g = { key : '', val: [] }
229 for (var i = 0; i < ar.length; i ++) {
238 state =2; // should be ':'
242 if (ar[i].data != ',') {
246 g = { key : '', val: [] }
252 // last.. - if g.val.length is 0 then it's a trailing ','...
253 // we should really throw a syntax error in that case..
254 if (k.length && g.val.length) {