Merge branch 'custom-classes' of https://github.com/YoshiCrafter29/hscript-improved into custom-classes

This commit is contained in:
Yoshman29
2023-04-10 02:56:20 +02:00
4 changed files with 113 additions and 21 deletions
+6 -6
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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 + " ");