Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
09923651d8 | ||
|
|
7ca5b85051 | ||
|
|
a34faf8a26 | ||
|
|
7708159e92 | ||
|
|
7851d48e82 | ||
|
|
f320b4fa9b | ||
|
|
b3ea81f4e8 |
+5
-9
@@ -4,10 +4,12 @@ os:
|
|||||||
- linux
|
- linux
|
||||||
- osx
|
- osx
|
||||||
|
|
||||||
osx_image: xcode6.4
|
sudo: false
|
||||||
|
dist: trusty
|
||||||
|
|
||||||
haxe:
|
haxe:
|
||||||
- "3.2.1"
|
- "3.2.1"
|
||||||
|
- "3.4.2"
|
||||||
- development
|
- development
|
||||||
|
|
||||||
addons:
|
addons:
|
||||||
@@ -24,14 +26,8 @@ addons:
|
|||||||
- mono-devel
|
- mono-devel
|
||||||
- mono-mcs
|
- mono-mcs
|
||||||
# Flash
|
# Flash
|
||||||
- libcurl3:i386
|
- libglib2.0
|
||||||
- libglib2.0-0:i386
|
- libfreetype6
|
||||||
- libx11-6:i386
|
|
||||||
- libxext6:i386
|
|
||||||
- libxt6:i386
|
|
||||||
- libxcursor1:i386
|
|
||||||
- libnss3:i386
|
|
||||||
- libgtk2.0-0:i386
|
|
||||||
|
|
||||||
install:
|
install:
|
||||||
# os-specific config
|
# os-specific config
|
||||||
|
|||||||
@@ -21,8 +21,15 @@ class Test extends TestCase {
|
|||||||
function test():Void {
|
function test():Void {
|
||||||
assertScript("0",0);
|
assertScript("0",0);
|
||||||
assertScript("0xFF", 255);
|
assertScript("0xFF", 255);
|
||||||
assertScript("0xBFFFFFFF", 0xBFFFFFFF);
|
#if !(php || python)
|
||||||
assertScript("0x7FFFFFFF", 0x7FFFFFFF);
|
#if haxe3
|
||||||
|
assertScript("0xBFFFFFFF", 0xBFFFFFFF);
|
||||||
|
assertScript("0x7FFFFFFF", 0x7FFFFFFF);
|
||||||
|
#elseif !neko
|
||||||
|
assertScript("n(0xBFFFFFFF)", 0xBFFFFFFF, { n : haxe.Int32.toNativeInt });
|
||||||
|
assertScript("n(0x7FFFFFFF)", 0x7FFFFFFF, { n : haxe.Int32.toNativeInt } );
|
||||||
|
#end
|
||||||
|
#end
|
||||||
assertScript("-123",-123);
|
assertScript("-123",-123);
|
||||||
assertScript("- 123",-123);
|
assertScript("- 123",-123);
|
||||||
assertScript("1.546",1.546);
|
assertScript("1.546",1.546);
|
||||||
|
|||||||
+4
-2
@@ -6,13 +6,15 @@ environment:
|
|||||||
|
|
||||||
install:
|
install:
|
||||||
# Install the haxe chocolatey package (https://chocolatey.org/packages/haxe)
|
# Install the haxe chocolatey package (https://chocolatey.org/packages/haxe)
|
||||||
- cinst haxe -version 3.2.1 -y
|
- cinst haxe -version 3.4.2 -y
|
||||||
- RefreshEnv
|
- RefreshEnv
|
||||||
# Setup haxelib
|
# Setup haxelib
|
||||||
- mkdir "%HAXELIB_ROOT%"
|
- mkdir "%HAXELIB_ROOT%"
|
||||||
- haxelib setup "%HAXELIB_ROOT%"
|
- haxelib setup "%HAXELIB_ROOT%"
|
||||||
# Install test dependencies
|
# Install test dependencies
|
||||||
|
- ps: Set-Service wuauserv -StartupType Manual
|
||||||
- cinst php -y
|
- cinst php -y
|
||||||
|
- RefreshEnv
|
||||||
# Download and setup a standalone flash player debugger
|
# Download and setup a standalone flash player debugger
|
||||||
- haxe flash/install.hxml
|
- haxe flash/install.hxml
|
||||||
# Install project dependencies
|
# Install project dependencies
|
||||||
@@ -35,5 +37,5 @@ test_script:
|
|||||||
- haxe bin/build-cs.hxml && bin\bin\Test.exe
|
- haxe bin/build-cs.hxml && bin\bin\Test.exe
|
||||||
- haxe bin/build-cpp.hxml && bin\Test.exe
|
- haxe bin/build-cpp.hxml && bin\Test.exe
|
||||||
- haxe bin/build-flash.hxml -D fdb && haxe flash\run.hxml bin\Test.swf
|
- haxe bin/build-flash.hxml -D fdb && haxe flash\run.hxml bin\Test.swf
|
||||||
- haxe bin/build-php.hxml && C:\tools\php\php.exe bin\index.php
|
- haxe bin/build-php.hxml && php bin\index.php
|
||||||
- haxe bin/build-python.hxml && C:\Python34-x64\python.exe bin\Test.py
|
- haxe bin/build-python.hxml && C:\Python34-x64\python.exe bin\Test.py
|
||||||
+7
-4
@@ -7,11 +7,11 @@ class Install {
|
|||||||
// https://www.adobe.com/support/flashplayer/downloads.html
|
// https://www.adobe.com/support/flashplayer/downloads.html
|
||||||
static var fpDownload(default, never) = switch (systemName()) {
|
static var fpDownload(default, never) = switch (systemName()) {
|
||||||
case "Linux":
|
case "Linux":
|
||||||
"https://fpdownload.macromedia.com/pub/flashplayer/updaters/11/flashplayer_11_sa_debug.i386.tar.gz";
|
"http://fpdownload.macromedia.com/pub/flashplayer/updaters/25/flash_player_sa_linux_debug.x86_64.tar.gz";
|
||||||
case "Mac":
|
case "Mac":
|
||||||
"https://fpdownload.macromedia.com/pub/flashplayer/updaters/21/flashplayer_21_sa_debug.dmg";
|
"http://fpdownload.macromedia.com/pub/flashplayer/updaters/25/flashplayer_25_sa_debug.dmg";
|
||||||
case "Windows":
|
case "Windows":
|
||||||
"http://fpdownload.macromedia.com/pub/flashplayer/updaters/21/flashplayer_21_sa_debug.exe";
|
"http://fpdownload.macromedia.com/pub/flashplayer/updaters/25/flashplayer_25_sa_debug.exe";
|
||||||
case _:
|
case _:
|
||||||
throw "unsupported system";
|
throw "unsupported system";
|
||||||
}
|
}
|
||||||
@@ -46,6 +46,9 @@ class Install {
|
|||||||
if (command("tar", ["-xf", Path.withoutDirectory(fpDownload), "-C", "flash"]) != 0)
|
if (command("tar", ["-xf", Path.withoutDirectory(fpDownload), "-C", "flash"]) != 0)
|
||||||
throw "failed to extract flash player";
|
throw "failed to extract flash player";
|
||||||
case "Mac":
|
case "Mac":
|
||||||
|
// https://github.com/caskroom/homebrew-cask/pull/15381
|
||||||
|
if (command("brew", ["uninstall", "--force", "brew-cask"]) != 0)
|
||||||
|
throw "failed to brew uninstall --force brew-cask";
|
||||||
if (command("brew", ["tap", "caskroom/versions"]) != 0)
|
if (command("brew", ["tap", "caskroom/versions"]) != 0)
|
||||||
throw "failed to brew tap caskroom/versions";
|
throw "failed to brew tap caskroom/versions";
|
||||||
if (command("brew", ["cask", "install", "flash-player-debugger"]) != 0)
|
if (command("brew", ["cask", "install", "flash-player-debugger"]) != 0)
|
||||||
@@ -84,7 +87,7 @@ class Install {
|
|||||||
if (command("sudo", ["chmod", "a+rw", dir]) != 0)
|
if (command("sudo", ["chmod", "a+rw", dir]) != 0)
|
||||||
throw 'cannot set permission of $dir';
|
throw 'cannot set permission of $dir';
|
||||||
case _:
|
case _:
|
||||||
neko.Lib.rethrow(e);
|
throw 'cannot create $dir: $e';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-3
@@ -21,12 +21,13 @@ class Run {
|
|||||||
var exitCode = switch (systemName()) {
|
var exitCode = switch (systemName()) {
|
||||||
case "Linux":
|
case "Linux":
|
||||||
// The flash player has some issues with unexplained crashes,
|
// The flash player has some issues with unexplained crashes,
|
||||||
// but if it runs about 8 times, it should succeed one of those...
|
// but if it runs about 16 times, it should succeed one of those...
|
||||||
var c = -1;
|
var c = -1;
|
||||||
for (i in 0...8) {
|
for (i in 0...16) {
|
||||||
if ((c = command("xvfb-run", ["flash/flashplayerdebugger", swf])) == 0)
|
if ((c = command("xvfb-run", ["-a", "flash/flashplayerdebugger", swf])) == 0)
|
||||||
break;
|
break;
|
||||||
println('retry... (${i+1})');
|
println('retry... (${i+1})');
|
||||||
|
sleep(1.5);
|
||||||
}
|
}
|
||||||
c;
|
c;
|
||||||
case "Mac":
|
case "Mac":
|
||||||
|
|||||||
+2
-2
@@ -3,7 +3,7 @@
|
|||||||
"url": "https://github.com/HaxeFoundation/hscript",
|
"url": "https://github.com/HaxeFoundation/hscript",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"description": "Haxe Script is a scripting engine for a subset of the Haxe language",
|
"description": "Haxe Script is a scripting engine for a subset of the Haxe language",
|
||||||
"version": "2.0.7",
|
"version": "2.1.0",
|
||||||
"releasenote": "fixes for haxe 3.3, use property access by default",
|
"releasenote": "added metadata support",
|
||||||
"contributors": ["ncannasse"]
|
"contributors": ["ncannasse"]
|
||||||
}
|
}
|
||||||
+5
-2
@@ -70,14 +70,17 @@ enum Expr {
|
|||||||
ETernary( cond : Expr, e1 : Expr, e2 : 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);
|
EDoWhile( cond : Expr, e : Expr);
|
||||||
|
EMeta( name : String, args : Array<Expr>, e : Expr );
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef Argument = { name : String, ?t : CType, ?opt : Bool };
|
typedef Argument = { name : String, ?t : CType, ?opt : Bool };
|
||||||
|
|
||||||
|
typedef Metadata = Array<{ name : String, params : Array<Expr> }>;
|
||||||
|
|
||||||
enum CType {
|
enum CType {
|
||||||
CTPath( path : Array<String>, ?params : Array<CType> );
|
CTPath( path : Array<String>, ?params : Array<CType> );
|
||||||
CTFun( args : Array<CType>, ret : CType );
|
CTFun( args : Array<CType>, ret : CType );
|
||||||
CTAnon( fields : Array<{ name : String, t : CType }> );
|
CTAnon( fields : Array<{ name : String, t : CType, ?meta : Metadata }> );
|
||||||
CTParent( t : CType );
|
CTParent( t : CType );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -99,7 +102,7 @@ class Error {
|
|||||||
private function errorDefToString(): String {
|
private function errorDefToString(): String {
|
||||||
switch (e) {
|
switch (e) {
|
||||||
case EInvalidChar(c):
|
case EInvalidChar(c):
|
||||||
return "Invalid character: '"+c+"'";
|
return "Invalid character: '"+String.fromCharCode(c)+"' ("+c+")";
|
||||||
|
|
||||||
case EUnexpected(s):
|
case EUnexpected(s):
|
||||||
return "Unexpected token: \""+s+"\"";
|
return "Unexpected token: \""+s+"\"";
|
||||||
|
|||||||
+5
-3
@@ -137,7 +137,7 @@ class Interp {
|
|||||||
else {
|
else {
|
||||||
arr[index] = v;
|
arr[index] = v;
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
error(EInvalidOp("="));
|
error(EInvalidOp("="));
|
||||||
}
|
}
|
||||||
@@ -560,6 +560,8 @@ class Interp {
|
|||||||
if( !match )
|
if( !match )
|
||||||
val = def == null ? null : expr(def);
|
val = def == null ? null : expr(def);
|
||||||
return val;
|
return val;
|
||||||
|
case EMeta(_, _, e):
|
||||||
|
return expr(e);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -629,7 +631,7 @@ class Interp {
|
|||||||
inline function isMap(o:Dynamic):Bool {
|
inline function isMap(o:Dynamic):Bool {
|
||||||
return Std.is(o, haxe.Constraints.IMap);
|
return Std.is(o, haxe.Constraints.IMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline function getMapValue(map:Dynamic, key:Dynamic):Dynamic {
|
inline function getMapValue(map:Dynamic, key:Dynamic):Dynamic {
|
||||||
return cast(map, haxe.Constraints.IMap<Dynamic, Dynamic>).get(key);
|
return cast(map, haxe.Constraints.IMap<Dynamic, Dynamic>).get(key);
|
||||||
}
|
}
|
||||||
@@ -637,7 +639,7 @@ class Interp {
|
|||||||
inline function setMapValue(map:Dynamic, key:Dynamic, value:Dynamic):Void {
|
inline function setMapValue(map:Dynamic, key:Dynamic, value:Dynamic):Void {
|
||||||
cast(map, haxe.Constraints.IMap<Dynamic, Dynamic>).set(key, value);
|
cast(map, haxe.Constraints.IMap<Dynamic, Dynamic>).set(key, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
function get( o : Dynamic, f : String ) : Dynamic {
|
function get( o : Dynamic, f : String ) : Dynamic {
|
||||||
if ( o == null ) error(EInvalidAccess(f));
|
if ( o == null ) error(EInvalidAccess(f));
|
||||||
return {
|
return {
|
||||||
|
|||||||
@@ -231,6 +231,9 @@ class Macro {
|
|||||||
ETernary(convert(cond), convert(e1), convert(e2));
|
ETernary(convert(cond), convert(e1), convert(e2));
|
||||||
case ESwitch(e, cases, edef):
|
case ESwitch(e, cases, edef):
|
||||||
ESwitch(convert(e), [for( c in cases ) { values : [for( v in c.values ) convert(v)], expr : convert(c.expr) } ], edef == null ? null : convert(edef));
|
ESwitch(convert(e), [for( c in cases ) { values : [for( v in c.values ) convert(v)], expr : convert(c.expr) } ], edef == null ? null : convert(edef));
|
||||||
|
case EMeta(m, params, esub):
|
||||||
|
var mpos = #if hscriptPos { file : p.file, min : e.pmin, max : e.pmax } #else p #end;
|
||||||
|
EMeta({ name : m, params : params == null ? [] : [for( p in params ) convert(p)], pos : mpos }, convert(esub));
|
||||||
}, pos : #if hscriptPos { file : p.file, min : e.pmin, max : e.pmax } #else p #end }
|
}, pos : #if hscriptPos { file : p.file, min : e.pmin, max : e.pmax } #else p #end }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+81
-46
@@ -41,6 +41,7 @@ enum Token {
|
|||||||
TBkClose;
|
TBkClose;
|
||||||
TQuestion;
|
TQuestion;
|
||||||
TDoubleDot;
|
TDoubleDot;
|
||||||
|
TMeta( s : String );
|
||||||
}
|
}
|
||||||
|
|
||||||
class Parser {
|
class Parser {
|
||||||
@@ -69,6 +70,11 @@ class Parser {
|
|||||||
**/
|
**/
|
||||||
public var allowTypes : Bool;
|
public var allowTypes : Bool;
|
||||||
|
|
||||||
|
/**
|
||||||
|
allow haxe metadata declarations
|
||||||
|
**/
|
||||||
|
public var allowMetadata : Bool;
|
||||||
|
|
||||||
// implementation
|
// implementation
|
||||||
var input : haxe.io.Input;
|
var input : haxe.io.Input;
|
||||||
var char : Int;
|
var char : Int;
|
||||||
@@ -200,6 +206,16 @@ class Parser {
|
|||||||
if( t != tk ) unexpected(t);
|
if( t != tk ) unexpected(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getIdent() {
|
||||||
|
var tk = token();
|
||||||
|
switch( tk ) {
|
||||||
|
case TId(id): return id;
|
||||||
|
default:
|
||||||
|
unexpected(tk);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
inline function expr(e:Expr) {
|
inline function expr(e:Expr) {
|
||||||
#if hscriptPos
|
#if hscriptPos
|
||||||
return e.e;
|
return e.e;
|
||||||
@@ -384,12 +400,39 @@ class Parser {
|
|||||||
return parseExprNext(e);
|
return parseExprNext(e);
|
||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
return parseExprNext(mk(EArrayDecl(a),p1));
|
return parseExprNext(mk(EArrayDecl(a), p1));
|
||||||
|
case TMeta(id) if( allowMetadata ):
|
||||||
|
var args = parseMetaArgs();
|
||||||
|
return mk(EMeta(id, args, parseExpr()),p1);
|
||||||
default:
|
default:
|
||||||
return unexpected(tk);
|
return unexpected(tk);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function parseMetaArgs() {
|
||||||
|
var tk = token();
|
||||||
|
if( tk != TPOpen ) {
|
||||||
|
push(tk);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
var args = [];
|
||||||
|
tk = token();
|
||||||
|
if( tk != TPClose ) {
|
||||||
|
push(tk);
|
||||||
|
while( true ) {
|
||||||
|
args.push(parseExpr());
|
||||||
|
switch( token() ) {
|
||||||
|
case TComma:
|
||||||
|
case TPClose:
|
||||||
|
break;
|
||||||
|
case tk:
|
||||||
|
unexpected(tk);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return args;
|
||||||
|
}
|
||||||
|
|
||||||
function mapCompr( tmp : String, e : Expr ) {
|
function mapCompr( tmp : String, e : Expr ) {
|
||||||
var edef = switch( expr(e) ) {
|
var edef = switch( expr(e) ) {
|
||||||
case EFor(v, it, e2):
|
case EFor(v, it, e2):
|
||||||
@@ -460,13 +503,8 @@ class Parser {
|
|||||||
}
|
}
|
||||||
mk(EIf(cond,e1,e2),p1,(e2 == null) ? tokenMax : pmax(e2));
|
mk(EIf(cond,e1,e2),p1,(e2 == null) ? tokenMax : pmax(e2));
|
||||||
case "var":
|
case "var":
|
||||||
|
var ident = getIdent();
|
||||||
var tk = token();
|
var tk = token();
|
||||||
var ident = null;
|
|
||||||
switch(tk) {
|
|
||||||
case TId(id): ident = id;
|
|
||||||
default: unexpected(tk);
|
|
||||||
}
|
|
||||||
tk = token();
|
|
||||||
var t = null;
|
var t = null;
|
||||||
if( tk == TDoubleDot && allowTypes ) {
|
if( tk == TDoubleDot && allowTypes ) {
|
||||||
t = parseType();
|
t = parseType();
|
||||||
@@ -494,13 +532,8 @@ class Parser {
|
|||||||
mk(EDoWhile(econd,e),p1,pmax(econd));
|
mk(EDoWhile(econd,e),p1,pmax(econd));
|
||||||
case "for":
|
case "for":
|
||||||
ensure(TPOpen);
|
ensure(TPOpen);
|
||||||
|
var vname = getIdent();
|
||||||
var tk = token();
|
var tk = token();
|
||||||
var vname = null;
|
|
||||||
switch( tk ) {
|
|
||||||
case TId(id): vname = id;
|
|
||||||
default: unexpected(tk);
|
|
||||||
}
|
|
||||||
tk = token();
|
|
||||||
if( !Type.enumEq(tk,TId("in")) ) unexpected(tk);
|
if( !Type.enumEq(tk,TId("in")) ) unexpected(tk);
|
||||||
var eiter = parseExpr();
|
var eiter = parseExpr();
|
||||||
ensure(TPClose);
|
ensure(TPClose);
|
||||||
@@ -568,21 +601,13 @@ class Parser {
|
|||||||
mk(EReturn(e),p1,if( e == null ) tokenMax else pmax(e));
|
mk(EReturn(e),p1,if( e == null ) tokenMax else pmax(e));
|
||||||
case "new":
|
case "new":
|
||||||
var a = new Array();
|
var a = new Array();
|
||||||
var tk = token();
|
a.push(getIdent());
|
||||||
switch( tk ) {
|
|
||||||
case TId(id): a.push(id);
|
|
||||||
default: unexpected(tk);
|
|
||||||
}
|
|
||||||
var next = true;
|
var next = true;
|
||||||
while( next ) {
|
while( next ) {
|
||||||
tk = token();
|
var tk = token();
|
||||||
switch( tk ) {
|
switch( tk ) {
|
||||||
case TDot:
|
case TDot:
|
||||||
tk = token();
|
a.push(getIdent());
|
||||||
switch(tk) {
|
|
||||||
case TId(id): a.push(id);
|
|
||||||
default: unexpected(tk);
|
|
||||||
}
|
|
||||||
case TPOpen:
|
case TPOpen:
|
||||||
next = false;
|
next = false;
|
||||||
default:
|
default:
|
||||||
@@ -599,11 +624,7 @@ class Parser {
|
|||||||
var tk = token();
|
var tk = token();
|
||||||
if( !Type.enumEq(tk, TId("catch")) ) unexpected(tk);
|
if( !Type.enumEq(tk, TId("catch")) ) unexpected(tk);
|
||||||
ensure(TPOpen);
|
ensure(TPOpen);
|
||||||
tk = token();
|
var vname = getIdent();
|
||||||
var vname = switch( tk ) {
|
|
||||||
case TId(id): id;
|
|
||||||
default: unexpected(tk);
|
|
||||||
}
|
|
||||||
ensure(TDoubleDot);
|
ensure(TDoubleDot);
|
||||||
var t = null;
|
var t = null;
|
||||||
if( allowTypes )
|
if( allowTypes )
|
||||||
@@ -700,12 +721,7 @@ class Parser {
|
|||||||
}
|
}
|
||||||
return makeBinop(op,e1,parseExpr());
|
return makeBinop(op,e1,parseExpr());
|
||||||
case TDot:
|
case TDot:
|
||||||
tk = token();
|
var field = getIdent();
|
||||||
var field = null;
|
|
||||||
switch(tk) {
|
|
||||||
case TId(id): field = id;
|
|
||||||
default: unexpected(tk);
|
|
||||||
}
|
|
||||||
return parseExprNext(mk(EField(e1,field),pmin(e1)));
|
return parseExprNext(mk(EField(e1,field),pmin(e1)));
|
||||||
case TPOpen:
|
case TPOpen:
|
||||||
return parseExprNext(mk(ECall(e1,parseExprList(TPClose)),pmin(e1)));
|
return parseExprNext(mk(ECall(e1,parseExprList(TPClose)),pmin(e1)));
|
||||||
@@ -733,13 +749,7 @@ class Parser {
|
|||||||
t = token();
|
t = token();
|
||||||
if( t != TDot )
|
if( t != TDot )
|
||||||
break;
|
break;
|
||||||
t = token();
|
path.push(getIdent());
|
||||||
switch( t ) {
|
|
||||||
case TId(v):
|
|
||||||
path.push(v);
|
|
||||||
default:
|
|
||||||
unexpected(t);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
var params = null;
|
var params = null;
|
||||||
switch( t ) {
|
switch( t ) {
|
||||||
@@ -758,7 +768,7 @@ class Parser {
|
|||||||
tokens.add({ t : TOp(op.substr(1)), min : tokenMax - op.length - 1, max : tokenMax });
|
tokens.add({ t : TOp(op.substr(1)), min : tokenMax - op.length - 1, max : tokenMax });
|
||||||
#else
|
#else
|
||||||
tokens.add(TOp(op.substr(1)));
|
tokens.add(TOp(op.substr(1)));
|
||||||
#end
|
#end
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
@@ -777,19 +787,29 @@ class Parser {
|
|||||||
return parseTypeNext(CTParent(t));
|
return parseTypeNext(CTParent(t));
|
||||||
case TBrOpen:
|
case TBrOpen:
|
||||||
var fields = [];
|
var fields = [];
|
||||||
|
var meta = null;
|
||||||
while( true ) {
|
while( true ) {
|
||||||
t = token();
|
t = token();
|
||||||
switch( t ) {
|
switch( t ) {
|
||||||
case TBrClose: break;
|
case TBrClose: break;
|
||||||
|
case TId("var"):
|
||||||
|
var name = getIdent();
|
||||||
|
ensure(TDoubleDot);
|
||||||
|
fields.push( { name : name, t : parseType(), meta : meta } );
|
||||||
|
meta = null;
|
||||||
|
ensure(TSemicolon);
|
||||||
case TId(name):
|
case TId(name):
|
||||||
ensure(TDoubleDot);
|
ensure(TDoubleDot);
|
||||||
fields.push( { name : name, t : parseType() } );
|
fields.push( { name : name, t : parseType(), meta : meta } );
|
||||||
t = token();
|
t = token();
|
||||||
switch( t ) {
|
switch( t ) {
|
||||||
case TComma:
|
case TComma:
|
||||||
case TBrClose: break;
|
case TBrClose: break;
|
||||||
default: unexpected(t);
|
default: unexpected(t);
|
||||||
}
|
}
|
||||||
|
case TMeta(name):
|
||||||
|
if( meta == null ) meta = [];
|
||||||
|
meta.push({ name : name, params : parseMetaArgs() });
|
||||||
default:
|
default:
|
||||||
unexpected(t);
|
unexpected(t);
|
||||||
}
|
}
|
||||||
@@ -983,7 +1003,7 @@ class Parser {
|
|||||||
// in case of '...'
|
// in case of '...'
|
||||||
if( exp == 10 && readChar() == 46 ) {
|
if( exp == 10 && readChar() == 46 ) {
|
||||||
push(TOp("..."));
|
push(TOp("..."));
|
||||||
var i = Std.int(n) & 0xFFFFFFFF;
|
var i = Std.int(n);
|
||||||
return TConst( (i == n) ? CInt(i) : CFloat(n) );
|
return TConst( (i == n) ? CInt(i) : CFloat(n) );
|
||||||
}
|
}
|
||||||
invalidChar(char);
|
invalidChar(char);
|
||||||
@@ -1006,7 +1026,7 @@ class Parser {
|
|||||||
n = (n << 4) + (char - 87);
|
n = (n << 4) + (char - 87);
|
||||||
default:
|
default:
|
||||||
this.char = char;
|
this.char = char;
|
||||||
return TConst(CInt(n & 0xFFFFFFFF));
|
return TConst(CInt(n));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
@@ -1082,6 +1102,20 @@ class Parser {
|
|||||||
return TOp("=>");
|
return TOp("=>");
|
||||||
this.char = char;
|
this.char = char;
|
||||||
return TOp("=");
|
return TOp("=");
|
||||||
|
case '@'.code:
|
||||||
|
char = readChar();
|
||||||
|
if( idents[char] || char == ':'.code ) {
|
||||||
|
var id = String.fromCharCode(char);
|
||||||
|
while( true ) {
|
||||||
|
char = readChar();
|
||||||
|
if( !idents[char] ) {
|
||||||
|
this.char = char;
|
||||||
|
return TMeta(id);
|
||||||
|
}
|
||||||
|
id += String.fromCharCode(char);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
invalidChar(char);
|
||||||
default:
|
default:
|
||||||
if( ops[char] ) {
|
if( ops[char] ) {
|
||||||
var op = String.fromCharCode(char);
|
var op = String.fromCharCode(char);
|
||||||
@@ -1186,6 +1220,7 @@ class Parser {
|
|||||||
case TBkClose: "]";
|
case TBkClose: "]";
|
||||||
case TQuestion: "?";
|
case TQuestion: "?";
|
||||||
case TDoubleDot: ":";
|
case TDoubleDot: ":";
|
||||||
|
case TMeta(id): "@" + id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user