Merge branch 'custom-classes' of https://github.com/YoshiCrafter29/hscript-improved into custom-classes
This commit is contained in:
+6
-6
@@ -45,10 +45,10 @@ enum Expr {
|
||||
#end
|
||||
EConst( c : Const );
|
||||
EIdent( v : String );
|
||||
EVar( n : String, ?t : CType, ?e : Expr, ?isPublic : Bool, ?isStatic : Bool);
|
||||
EVar( n : String, ?t : CType, ?e : Expr, ?isPublic : Bool, ?isStatic : Bool );
|
||||
EParent( e : Expr );
|
||||
EBlock( e : Array<Expr> );
|
||||
EField( e : Expr, f : String );
|
||||
EField( e : Expr, f : String , ?safe : Bool );
|
||||
EBinop( op : String, e1 : Expr, e2 : Expr );
|
||||
EUnop( op : String, prefix : Bool, e : Expr );
|
||||
ECall( e : Expr, params : Array<Expr> );
|
||||
@@ -57,22 +57,22 @@ enum Expr {
|
||||
EFor( v : String, it : Expr, e : Expr );
|
||||
EBreak;
|
||||
EContinue;
|
||||
EFunction( args : Array<Argument>, e : Expr, ?name : String, ?ret : CType, ?isPublic : Bool, ?isStatic : Bool, ?isOverride : Bool);
|
||||
EFunction( args : Array<Argument>, e : Expr, ?name : String, ?ret : CType, ?isPublic : Bool, ?isStatic : Bool, ?isOverride : Bool );
|
||||
EReturn( ?e : Expr );
|
||||
EArray( e : Expr, index : Expr );
|
||||
EArrayDecl( e : Array<Expr>, ?wantedType: CType);
|
||||
EArrayDecl( e : Array<Expr>, ?wantedType: CType );
|
||||
ENew( cl : String, params : Array<Expr> );
|
||||
EThrow( e : Expr );
|
||||
ETry( e : Expr, v : String, t : Null<CType>, ecatch : Expr );
|
||||
EObject( fl : Array<{ name : String, e : Expr }> );
|
||||
ETernary( cond : Expr, e1 : Expr, e2 : Expr );
|
||||
ESwitch( e : Expr, cases : Array<{ values : Array<Expr>, expr : Expr }>, ?defaultExpr : Expr);
|
||||
ESwitch( e : Expr, cases : Array<{ values : Array<Expr>, expr : Expr }>, ?defaultExpr : Expr );
|
||||
EDoWhile( cond : Expr, e : Expr);
|
||||
EMeta( name : String, args : Array<Expr>, e : Expr );
|
||||
ECheckType( e : Expr, t : CType );
|
||||
|
||||
EImport( c : String );
|
||||
EClass(name:String, fields:Array<Expr>, ?extend:String, interfaces:Array<String>);
|
||||
EClass( name:String, fields:Array<Expr>, ?extend:String, interfaces:Array<String> );
|
||||
}
|
||||
|
||||
typedef Argument = { name : String, ?t : CType, ?opt : Bool, ?value : Expr };
|
||||
|
||||
+24
-7
@@ -161,6 +161,10 @@ class Interp {
|
||||
binops.set("||", function(e1, e2) return me.expr(e1) == true || me.expr(e2) == true);
|
||||
binops.set("&&", function(e1, e2) return me.expr(e1) == true && me.expr(e2) == true);
|
||||
binops.set("=", assign);
|
||||
binops.set("??", function(e1, e2) {
|
||||
var expr1:Dynamic = me.expr(e1);
|
||||
return expr1 == null ? me.expr(e2) : expr1;
|
||||
});
|
||||
binops.set("...", function(e1, e2) return new
|
||||
#if (haxe_211 || haxe3)
|
||||
IntIterator
|
||||
@@ -179,6 +183,7 @@ class Interp {
|
||||
assignOp(">>=", function(v1, v2) return v1 >> v2);
|
||||
assignOp(">>>=", function(v1, v2) return v1 >>> v2);
|
||||
assignOp("is", function(v1, v2) return Std.isOfType(v1, v2));
|
||||
assignOp("??=", function(v1, v2) return v1 == null ? v2 : v1);
|
||||
}
|
||||
|
||||
function setVar(name:String, v:Dynamic) {
|
||||
@@ -418,7 +423,7 @@ class Interp {
|
||||
return l.r;
|
||||
|
||||
var v = variables.get(id);
|
||||
for(map in [customClasses, staticVariables, publicVariables, variables])
|
||||
for(map in [variables, publicVariables, staticVariables, customClasses])
|
||||
if (map.exists(id))
|
||||
return map[id];
|
||||
|
||||
@@ -505,8 +510,15 @@ class Interp {
|
||||
case EVar(n, _, e, isPublic, isStatic):
|
||||
declared.push({n: n, old: locals.get(n), depth: depth});
|
||||
locals.set(n, {r: (e == null) ? null : expr(e), depth: depth});
|
||||
if (depth == 0)
|
||||
(isStatic == true ? staticVariables : (isPublic ? publicVariables : variables)).set(n, locals[n].r);
|
||||
if (depth == 0) {
|
||||
if(isStatic == true) {
|
||||
if(!staticVariables.exists(n)) {
|
||||
staticVariables.set(n, locals[n].r);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
(isPublic ? publicVariables : variables).set(n, locals[n].r);
|
||||
}
|
||||
return null;
|
||||
case EParent(e):
|
||||
return expr(e);
|
||||
@@ -517,8 +529,11 @@ class Interp {
|
||||
v = expr(e);
|
||||
restore(old);
|
||||
return v;
|
||||
case EField(e, f):
|
||||
return get(expr(e), f);
|
||||
case EField(e, f, s):
|
||||
var field = expr(e);
|
||||
if(s && field == null)
|
||||
return null;
|
||||
return get(field, f);
|
||||
case EBinop(op, e1, e2):
|
||||
var fop = binops.get(op);
|
||||
if (fop == null)
|
||||
@@ -549,10 +564,12 @@ class Interp {
|
||||
args.push(expr(p));
|
||||
|
||||
switch (Tools.expr(e)) {
|
||||
case EField(e, f):
|
||||
case EField(e, f, s):
|
||||
var obj = expr(e);
|
||||
if (obj == null)
|
||||
if (obj == null) {
|
||||
if(s) return null;
|
||||
error(EInvalidAccess(f));
|
||||
}
|
||||
return fcall(obj, f, args);
|
||||
default:
|
||||
return call(null, expr(e), args);
|
||||
|
||||
+81
-6
@@ -32,6 +32,7 @@ enum Token {
|
||||
TBrOpen;
|
||||
TBrClose;
|
||||
TDot;
|
||||
TQuestionDot;
|
||||
TComma;
|
||||
TSemicolon;
|
||||
TBkOpen;
|
||||
@@ -123,8 +124,8 @@ class Parser {
|
||||
["..."],
|
||||
["&&"],
|
||||
["||"],
|
||||
["=","+=","-=","*=","/=","%=","<<=",">>=",">>>=","|=","&=","^=","=>"],
|
||||
["->"],
|
||||
["=","+=","-=","*=","/=","%=","<<=",">>=",">>>=","|=","&=","^=","=>","??="],
|
||||
["->", "??"],
|
||||
["is"]
|
||||
];
|
||||
#if haxe3
|
||||
@@ -630,6 +631,10 @@ class Parser {
|
||||
var str = parseStructure("var"); // override var
|
||||
nextIsOverride = false;
|
||||
str;
|
||||
case TId("final"):
|
||||
var str = parseStructure("final"); // override final
|
||||
nextIsOverride = false;
|
||||
str;
|
||||
default:
|
||||
unexpected(nextToken);
|
||||
nextIsOverride = false;
|
||||
@@ -655,6 +660,10 @@ class Parser {
|
||||
var str = parseStructure("var"); // static var
|
||||
nextIsStatic = false;
|
||||
str;
|
||||
case TId("final"):
|
||||
var str = parseStructure("final"); // static final
|
||||
nextIsStatic = false;
|
||||
str;
|
||||
default:
|
||||
unexpected(nextToken);
|
||||
nextIsStatic = false;
|
||||
@@ -680,12 +689,16 @@ class Parser {
|
||||
var str = parseStructure("var"); // public var
|
||||
nextIsPublic = false;
|
||||
str;
|
||||
case TId("final"):
|
||||
var str = parseStructure("final"); // public final
|
||||
nextIsPublic = false;
|
||||
str;
|
||||
default:
|
||||
unexpected(nextToken);
|
||||
nextIsPublic = false;
|
||||
null;
|
||||
}
|
||||
case "var":
|
||||
case "var" | "final":
|
||||
var ident = getIdent();
|
||||
var tk = token();
|
||||
var t = null;
|
||||
@@ -1015,9 +1028,9 @@ class Parser {
|
||||
return parseExprNext(mk(EUnop(op,false,e1),pmin(e1)));
|
||||
}
|
||||
return makeBinop(op,e1,parseExpr());
|
||||
case TDot:
|
||||
case TDot | TQuestionDot:
|
||||
var field = getIdent();
|
||||
return parseExprNext(mk(EField(e1,field),pmin(e1)));
|
||||
return parseExprNext(mk(EField(e1, field, tk == TQuestionDot), pmin(e1)));
|
||||
case TPOpen:
|
||||
return parseExprNext(mk(ECall(e1,parseExprList(TPClose)),pmin(e1)));
|
||||
case TBkOpen:
|
||||
@@ -1203,6 +1216,14 @@ class Parser {
|
||||
fields.push( { name : name, t : parseType(), meta : meta } );
|
||||
meta = null;
|
||||
ensure(TSemicolon);
|
||||
case TId("final"):
|
||||
var name = getIdent();
|
||||
ensure(TDoubleDot);
|
||||
if( meta == null ) meta = [];
|
||||
meta.push({ name : ":final", params : [] });
|
||||
fields.push( { name : name, t : parseType(), meta : meta } );
|
||||
meta = null;
|
||||
ensure(TSemicolon);
|
||||
case TId(name):
|
||||
ensure(TDoubleDot);
|
||||
fields.push( { name : name, t : parseType(), meta : meta } );
|
||||
@@ -1598,6 +1619,7 @@ class Parser {
|
||||
switch( char ) {
|
||||
case 48,49,50,51,52,53,54,55,56,57:
|
||||
n = n * 10 + (char - 48);
|
||||
case '_'.code:
|
||||
case "e".code, "E".code:
|
||||
var tk = token();
|
||||
var pow : Null<Int> = null;
|
||||
@@ -1641,6 +1663,7 @@ class Parser {
|
||||
n = (n << 4) + (char - 55);
|
||||
case 97,98,99,100,101,102: // a-f
|
||||
n = (n << 4) + (char - 87);
|
||||
case '_'.code:
|
||||
default:
|
||||
this.char = char;
|
||||
return TConst(CInt(n));
|
||||
@@ -1657,6 +1680,7 @@ class Parser {
|
||||
n = haxe.Int32.add(haxe.Int32.shl(n,4), cast (char - 55));
|
||||
case 97,98,99,100,101,102: // a-f
|
||||
n = haxe.Int32.add(haxe.Int32.shl(n,4), cast (char - 87));
|
||||
case '_'.code:
|
||||
default:
|
||||
this.char = char;
|
||||
// we allow to parse hexadecimal Int32 in Neko, but when the value will be
|
||||
@@ -1667,6 +1691,41 @@ class Parser {
|
||||
}
|
||||
}
|
||||
#end
|
||||
case "b".code: // Custom thing, not supported in haxe
|
||||
if( n > 0 || exp > 0 )
|
||||
invalidChar(char);
|
||||
// read binary
|
||||
#if haxe3
|
||||
var n = 0;
|
||||
while( true ) {
|
||||
char = readChar();
|
||||
switch( char ) {
|
||||
case 48,49: // 0-1
|
||||
n = (n << 1) + char - 48;
|
||||
case '_'.code:
|
||||
default:
|
||||
this.char = char;
|
||||
return TConst(CInt(n));
|
||||
}
|
||||
}
|
||||
#else
|
||||
var n = haxe.Int32.ofInt(0);
|
||||
while( true ) {
|
||||
char = readChar();
|
||||
switch( char ) {
|
||||
case 48,49: // 0-1
|
||||
n = haxe.Int32.add(haxe.Int32.shl(n,1), cast (char - 48));
|
||||
case '_'.code:
|
||||
default:
|
||||
this.char = char;
|
||||
// we allow to parse binary Int32 in Neko, but when the value will be
|
||||
// evaluated by Interpreter, a failure will occur if no Int32 operation is
|
||||
// performed
|
||||
var v = try CInt(haxe.Int32.toInt(n)) catch( e : Dynamic ) CInt32(n);
|
||||
return TConst(v);
|
||||
}
|
||||
}
|
||||
#end
|
||||
default:
|
||||
this.char = char;
|
||||
var i = Std.int(n);
|
||||
@@ -1708,7 +1767,22 @@ class Parser {
|
||||
case "[".code: return TBkOpen;
|
||||
case "]".code: return TBkClose;
|
||||
case "'".code, '"'.code: return TConst( CString(readString(char)) );
|
||||
case "?".code: return TQuestion;
|
||||
case "?".code:
|
||||
char = readChar();
|
||||
switch (char) {
|
||||
case '?'.code:
|
||||
var orp = readPos;
|
||||
if (readChar() == '='.code)
|
||||
return TOp("??=");
|
||||
|
||||
this.readPos = orp;
|
||||
return TOp("??");
|
||||
case '.'.code:
|
||||
return TQuestionDot;
|
||||
}
|
||||
|
||||
this.char = char;
|
||||
return TQuestion;
|
||||
case ":".code: return TDoubleDot;
|
||||
case '='.code:
|
||||
char = readChar();
|
||||
@@ -1936,6 +2010,7 @@ class Parser {
|
||||
case TBrOpen: "{";
|
||||
case TBrClose: "}";
|
||||
case TDot: ".";
|
||||
case TQuestionDot: "?.";
|
||||
case TComma: ",";
|
||||
case TSemicolon: ";";
|
||||
case TBkOpen: "[";
|
||||
|
||||
+2
-2
@@ -162,9 +162,9 @@ class Printer {
|
||||
tabs = tabs.substr(1);
|
||||
add("}");
|
||||
}
|
||||
case EField(e, f):
|
||||
case EField(e, f, s):
|
||||
expr(e);
|
||||
add("." + f);
|
||||
add((s == true ? "?." : ".") + f);
|
||||
case EBinop(op, e1, e2):
|
||||
expr(e1);
|
||||
add(" " + op + " ");
|
||||
|
||||
Reference in New Issue
Block a user