public class Collapse : TokenStream {
+
+
public Collapse(Gee.ArrayList<Token> tokens)
{
- parent(ar);;
+ base(tokens);
this.spaces();
- ar = this.collapse(this.tokens);
+ var ar = this.collapse(this.tokens);
this.tokens = ar;
var ar = new Gee.ArrayList<Token>();
var pref = new Gee.ArrayList<Token>();
-
+
for (var i = 0; i < this.tokens.size; i ++) {
var tok = this.tokens[i];
pref.add(tok);
continue;
}
- tok.prefix = '';
+ tok.prefix = "";
if (pref.size > 0) {
foreach(var e in pref) {
tok.prefix += e.data;
}
// console.log(tok.data);
+ debug("COL: %s", tok.asString());
+
switch(tok.type) {
case "VOID":
return ret; //EOF
case "STRN":
case "NUMB":
case "REGX":
- ret.push(st.next(1));
+ var nn = st.next();
+ if (nn != null) {
+ ret.add(nn);
+ }
continue;
case "PUNC":
case "(":
var start = st.cursor;
- st.next(1);
+ //st.next(); << no need to shift, balance will start at first character..
+
var add = st.balance(tok.data);
+
+ debug("BALANCE returned %d items\n", add.size);
+
+
// if (!add) {
//console.dump(tok);
//console.dump(start + '...' + st.cursor);
var toks = add.size > 0 ? this.collapse(add) : add;
tok.items = new Gee.ArrayList<Gee.ArrayList<Token>>(); //?? needed?
- tok.props = new Gee.HashMap<string,Gee.ArrayList<Token>>();
+ tok.props = new Gee.HashMap<string,TokenKeyMap>();
if (tok.data != "{") {
var ost = new TokenStream(toks);
//console.dump(ost.look(2,true) );
- if (ost.look(2,true) && ost.look(2,true).data == ":") {
+ if (ost.look(2,true) != null && ost.look(2,true).data == ":") {
// object properties...
tok.props = this.toProps(toks);
} else {
//Seed.print(" ADD : " + add.length + " ITEMS: " + tok.items.length);
- ret.push(tok);
+ ret.add(tok);
continue;
default:
- ret.push(st.next(1));
+ ret.add(st.next());
continue;
}
- Seed.print("OOPS");
+ print("OOPS");
continue;
default :
- Seed.print("OOPS" + tok.type);
+ print("OOPS" + tok.type);
continue;
}
}
var ret = new Gee.ArrayList<Gee.ArrayList<Token>>() ;
var g = new Gee.ArrayList<Token>() ;
- for (var i = 0; i < ar.length; i ++) {
+ for (var i = 0; i < ar.size; i ++) {
if (sep.index_of(ar.get(i).data) < 0) {
g.add(ar.get(i));
continue;
}
- Gee.HashMap<string,Gee.ArrayList<Token>> toProps (Gee.ArrayList<Token> ar)
+ Gee.HashMap<string,TokenKeyMap> toProps (Gee.ArrayList<Token> ar)
{
- var ret = new Gee.HashMap<string,Gee.ArrayList<Token>>();
+ var ret = new Gee.HashMap<string,TokenKeyMap>();
- var g = { key : '', val: [] }
+ var g = new TokenKeyMap();
- var k = '';
+ var k = "";
var state = 0;
- for (var i = 0; i < ar.length; i ++) {
+ for (var i = 0; i < ar.size; i ++) {
switch(state) {
case 0:
- k = ar[i].data;
- g.key = ar[i];
+ k = ar.get(i).data;
+ g.key = ar.get(i);
state = 1;
continue;
case 1:
state =2; // should be ':'
continue;
case 2:
- g.val.push(ar[i]);
- if (ar[i].data != ',') {
+ g.vals.add( ar.get(i));
+ if ( ar.get(i).data != ",") {
continue;
}
- ret[k] = g;
- g = { key : '', val: [] }
+ ret.set(k, g);
+ g = new TokenKeyMap();
state = 0;
continue;
}
// last.. - if g.val.length is 0 then it's a trailing ','...
// we should really throw a syntax error in that case..
- if (k.length && g.val.length) {
- ret[k] = g;
+ if (k.length > 0 && g.vals.size > 0) {
+ ret.set(k, g);
}
return ret;
}
+ }
-
-});
+}