Gee.HashMap<int,Scope> indexedScopes;
bool munge = true;
-
+ int expN = 0;
public ScopeParser(TokenStream ts) {
this.ts = ts; // {TokenStream}
}
- log : function(str)
+ void log(string str)
{
print(str);
//print (" ".substring(0, this.braceNesting*2) + str);
//println("<B>LOG:</B>" + htmlescape(str) + "<BR/>\n");
- },
- logR : function(str)
+ }
+ void logR (string str)
{
//println("<B>LOG:</B>" + str + "<BR/>");
- },
+ }
- parseScope : function(scope) // parse a token stream..
+ void parseScope(Scope scope) // parse a token stream..
{
//this.timerPrint("parseScope EnterScope");
//this.log(">>> ENTER SCOPE" + this.scopes.length);
- var symbol;
- var token;
-
- var identifier;
-
+
var expressionBraceNesting = this.braceNesting + 0;
var parensNesting = 0;
- var isObjectLitAr = [ false ];
- var isInObjectLitAr;
+ var isObjectLitAr = new Gee.ArrayList<bool>();
+ isObjectLitAr.add(false);
+
//var scopeIndent = '';
- token = this.ts.lookTok(1);
- while (token) {
+ var token = this.ts.lookTok(1);
+ while (token != null) {
// this.timerPrint("parseScope AFTER lookT: " + token.toString());
//this.dumpToken(token , this.scopes, this.braceNesting);
//print('SCOPE:' + token.toString());
token = this.ts.nextTok();
//!this.debug|| print( token.toString());
// print('SCOPE-VAR-VAL:' + JSON.stringify(token, null, 4));
- if (!token) { // can return false at EOF!
+ if (token == null) { // can return false at EOF!
break;
}
- if (token.name == "VAR" || token.data == ',') { // kludge..
+ if (token.name == "VAR" || token.data == ",") { // kludge..
continue;
}
//this.logR("parseScope GOT VAR : <B>" + token.toString() + "</B>");
if (token.type != "NAME") {
- for(var i = Math.max(this.ts.cursor-10,0); i < this.ts.cursor+1; i++) {
+
+ for(var i = int.max(this.ts.cursor-10,0); i < this.ts.cursor+1; i++) {
print(this.ts.tokens[i].toString());
}
print( "var without ident");
- Seed.quit()
+ GLib.Process.exit (0);
}
- if (this.mode == "BUILDING_SYMBOL_TREE") {
- identifier = scope.getIdentifier(token.data,token) ;
+ if (this.mode == ScopeParserMode.BUILDING_SYMBOL_TREE) {
+ var identifier = scope.getIdentifier(token.data,token) ;
if (identifier == false) {
scope.declareIdentifier(token.data, token);
} else {
token.identifier = identifier;
- this.warn("(SCOPE) The variable " + token.data + ' (line:' + token.line + ") has already been declared in the same scope...");
+ this.warn("(SCOPE) The variable " + token.data + " (line:" + token.line + ") has already been declared in the same scope...");
}
}
token = this.ts.nextTok();
- !this.debug|| print(token.toString());
+ //!this.debug|| print(token.toString());
/*
assert token.getType() == Token.SEMI ||
token.getType() == Token.ASSIGN ||
} else {
//var bn = this.braceNesting;
var bn = this.braceNesting;
- var nts = [];
+ var nts = new Gee.ArrayList<Token>();
while (true) {
- if (!token || token.type == 'VOID' || token.data == ',') {
+ if (!token || token.type == "VOID" || token.data == ",") {
break;
}
- nts.push(token);
+ nts.add(token);
token = this.ts.nextTok();
}
- if (nts.length) {
+ if (nts.size > 0) {
var TS = this.ts;
this.ts = new TokenStream(nts);
this.parseExpression(scope);
token = this.ts.lookTok(1);
//!this.debug||
// print("AFTER EXP: " + token.toString());
- if (token.data == ';') {
+ if (token.data == ";") {
break;
}
}
//print('SCOPE-CURLY/PAREN:' + token.toString());
//println("<i>"+token.data+"</i>");
var curTS = this.ts;
- if (token.props) {
+ if (token.props.size() > 0) {
// { a : ... , c : .... }
+ var iter = token.props.map_iterator();
- for (var prop in token.props) {
+ while(iter.next()) {
+
+ TokenKeyMap val = iter.get_value(); // TokenKeyMap
// print('SCOPE-PROPS:' + JSON.stringify(token.props[prop],null,4));
- if (token.props[prop].val[0].data == 'function') {
+ if (val.vals.get(0).data == "function") {
// parse a function..
- this.ts = new TokenStream(token.props[prop].val);
+ this.ts = new TokenStream(val.vals);
this.ts.nextTok();
this.parseFunctionDeclaration(scope);
}
// key value..
- this.ts = new TokenStream(token.props[prop].val);
+ this.ts = new TokenStream(val.vals);
this.parseExpression(scope);
}
// ( ... ) or { .... } not object literals..
- var _this = this;
- for (var xx =0; xx < token.items.length; xx++) {
- expr = token.items[xx];
+
+ for (var xx =0; xx < token.items.size; xx++) {
+ expr = token.items.get(xx);
//token.items.forEach(function(expr) {
//print(expr.toString());
- _this.ts = new TokenStream(expr);
+ this.ts = new TokenStream(expr);
//if (curTS.data == '(') {
- _this.parseScope(scope)
+ this.parseScope(scope);
//} else {
// _this.parseExpression(scope)
//}
case "KEYW.WITH":
//print('SCOPE-WITH:' + token.toString());
//println("<i>"+token.data+"</i>");
- if (this.mode == "BUILDING_SYMBOL_TREE") {
+ if (this.mode == ScopeParserMode.BUILDING_SYMBOL_TREE) {
// Inside a 'with' block, it is impossible to figure out
// statically whether a symbol is a local variable or an
// object member. As a consequence, the only thing we can
// print('SCOPE-STRING:' + token.toString());
//println("<i>"+token.data+"</i>");
- if (this.ts.lookTok(-1).data == '{' && this.ts.lookTok(1).data == ':') {
+ if (this.ts.lookTok(-1).data == "{" && this.ts.lookTok(1).data == ":") {
// then we are in an object lit.. -> we need to flag the brace as such...
- isObjectLitAr.pop();
- isObjectLitAr.push(true);
+ isObjectLitAr.remove_at(isObjectLitAr.size-1);
+ isObjectLitAr.add(true);
//print(">>>>>> OBJLIT REPUSH(true)");
}
- isInObjectLitAr = isObjectLitAr[isObjectLitAr.length-1];
+ isInObjectLitAr = isObjectLitAr.get(isObjectLitAr.size-1);
- if (isInObjectLitAr && this.ts.lookTok(1).data == ':' &&
- ( this.ts.lookTok(-1).data == '{' || this.ts.lookTok(-1).data == ':' )) {
+ if (isInObjectLitAr && this.ts.lookTok(1).data == ":" &&
+ ( this.ts.lookTok(-1).data == "{" || this.ts.lookTok(-1).data == ":" )) {
// see if we can replace..
// remove the quotes..
// should do a bit more checking!!!! (what about wierd char's in the string..
var str = token.data.substring(1,token.data.length-1);
- if (/^[a-z_]+$/i.test(str) && ScopeParser.idents.indexOf(str) < 0) {
+
+ if (Regex.match_simple ("^[a-z_]+$", str) && this.idents.index_of(str) < 0) {
token.outData = str;
}
//print("SYMBOL: " + token.toString());
symbol = token.data;
- if (symbol == 'this') {
+ if (symbol == "this") {
break;
}
- if (this.mode == 'PASS2_SYMBOL_TREE') {
+
+ if (this.mode == ScopeParserMode.PASS2_SYMBOL_TREE) {
//println("GOT IDENT: -2 : " + this.ts.lookT(-2).toString() + " <BR> ..... -1 : " + this.ts.lookT(-1).toString() + " <BR> ");
// We don't need to declare longer symbols since they won't cause
// any conflict with other munged symbols.
this.globalScope.declareIdentifier(symbol, token);
- this.warn("Found an undeclared symbol: " + symbol + ' (line:' + token.line + ')', true);
+ this.warn("Found an undeclared symbol: " + symbol + " (line:" + token.line + ")", true);
}
//println("GOT IDENT IGNORE(3): <B>" + symbol + "</B><BR/>");
break;
//println("<B>SID</B>");
default:
- if (token.type != 'KEYW') {
+ if (token.type != "KEYW") {
break;
}
//print('SCOPE-KEYW:' + token.toString());
symbol = token.data;
- if (this.mode == 'BUILDING_SYMBOL_TREE') {
+ if (this.mode == ScopeParserMode.BUILDING_SYMBOL_TREE) {
if (token.name == "EVAL") {
// look for eval:var:noreplace\n
//print("MATCH!?");
var _t = this;
+
+
token.prefix.replace(/eval:var:([a-z_]+)/ig, function(m, a) {
//print("GOT: " + a);
var hi = _t.getIdentifier(a, scope, token);
}
//print("<<< EXIT SCOPE");
//print("<<<<<<<EXIT SCOPE ERR?" +this.scopes.length);
- },
+ }
+
- expN : 0,
- parseExpression : function(scope) {
+
+ void parseExpression(Scope scope)
+ {
// Parse the expression until we encounter a comma or a semi-colon
// in the same brace nesting, bracket nesting and paren nesting.
// Parse functions if any...
//println("<i>EXP</i><BR/>");
- !this.debug || print("PARSE EXPR");
+ //!this.debug || print("PARSE EXPR");
this.expN++;
// for printing stuff..
- var symbol;
- var token;
-
- var identifier;
var expressionBraceNesting = this.braceNesting + 0;
var bracketNesting = 0;
var parensNesting = 0;
var isInObjectLitAr;
- var isObjectLitAr = [ false ];
+ var isObjectLitAr = new Gee.ArrayList<boolean>();
+ isObjectLitAr.add( false);
//print(scopeIndent + ">> ENTER EXPRESSION" + this.expN);
- while ((token = this.ts.nextTok())) {
+ while (null != (token = this.ts.nextTok())) {
//println("<i>"+token.data+"</i>");
//this.log("EXP:" + token.data);
switch (token.type) {
- case 'PUNC':
+ case "PUNC":
//print("EXPR-PUNC:" + token.toString());
switch(token.data) {
- case ';':
+ case ";":
//print("<< EXIT EXPRESSION");
break;
- case ',':
+ case ",":
break;
- case '(': //Token.LP:
- case '{': //Token.LC:
- case '[': //Token.LB:
+ case "(": //Token.LP:
+ case "{": //Token.LC:
+ case "[": //Token.LB:
//print('SCOPE-CURLY/PAREN/BRACE:' + token.toString());
// print('SCOPE-CURLY/PAREN/BRACE:' + JSON.stringify(token, null,4));
//println("<i>"+token.data+"</i>");
var curTS = this.ts;
- if (token.props) {
+ if (token.props.size > 0) {
+
+
for (var prop in token.props) {
if (!token.props[prop].val.length) {