From c124076279ca2bd1b9502d7865725bdfb17aa9fe Mon Sep 17 00:00:00 2001 From: Nicolas Cannasse Date: Sun, 4 Feb 2018 20:54:08 +0100 Subject: [PATCH] added typedef parsing support --- hscript/Expr.hx | 14 +++++++++++-- hscript/Parser.hx | 53 +++++++++++++++++++++++++++++++++++++---------- 2 files changed, 54 insertions(+), 13 deletions(-) diff --git a/hscript/Expr.hx b/hscript/Expr.hx index 368e785..b7c4520 100644 --- a/hscript/Expr.hx +++ b/hscript/Expr.hx @@ -119,15 +119,25 @@ enum ModuleDecl { DPackage( path : Array ); DImport( path : Array, ?everything : Bool ); DClass( c : ClassDecl ); + DTypedef( c : TypeDecl ); } -typedef ClassDecl = { +typedef ModuleType = { var name : String; var params : {}; // TODO : not yet parsed + var meta : Metadata; + var isPrivate : Bool; +} + +typedef ClassDecl = {> ModuleType, var extend : Null; var implement : Array; var fields : Array; - var meta : Metadata; + var isExtern : Bool; +} + +typedef TypeDecl = {> ModuleType, + var t : CType; } typedef FieldDecl = { diff --git a/hscript/Parser.hx b/hscript/Parser.hx index 15c4f02..cd48c66 100644 --- a/hscript/Parser.hx +++ b/hscript/Parser.hx @@ -214,6 +214,11 @@ class Parser { if( t != tk ) unexpected(t); } + inline function ensureToken(tk) { + var t = token(); + if( !Type.enumEq(t,tk) ) unexpected(t); + } + function maybe(tk) { var t = token(); if( Type.enumEq(t, tk) ) @@ -569,8 +574,7 @@ class Parser { case "for": ensure(TPOpen); var vname = getIdent(); - var tk = token(); - if( !Type.enumEq(tk,TId("in")) ) unexpected(tk); + ensureToken(TId("in")); var eiter = parseExpr(); ensure(TPClose); var e = parseExpr(); @@ -617,18 +621,15 @@ class Parser { mk(EThrow(e),p1,pmax(e)); case "try": var e = parseExpr(); - var tk = token(); - if( !Type.enumEq(tk, TId("catch")) ) unexpected(tk); + ensureToken(TId("catch")); ensure(TPOpen); var vname = getIdent(); ensure(TDoubleDot); var t = null; if( allowTypes ) t = parseType(); - else { - tk = token(); - if( !Type.enumEq(tk, TId("Dynamic")) ) unexpected(tk); - } + else + ensureToken(TId("Dynamic")); ensure(TPClose); var ec = parseExpr(); mk(ETry(e, vname, t, ec), p1, pmax(ec)); @@ -947,9 +948,27 @@ class Parser { return meta; } + function parseParams() { + if( maybe(TOp("<")) ) + error(EInvalidOp("Unsupported class type parameters"), readPos, readPos); + return {}; + } + function parseModuleDecl() : ModuleDecl { var meta = parseMetadata(); var ident = getIdent(); + var isPrivate = false, isExtern = false; + while( true ) { + switch( ident ) { + case "private": + isPrivate = true; + case "extern": + isExtern = true; + default: + break; + } + ident = getIdent(); + } switch( ident ) { case "package": var path = parsePath(); @@ -978,9 +997,7 @@ class Parser { return DImport(path, star); case "class": var name = getIdent(); - var params = {}; - if( maybe(TOp("<")) ) - error(EInvalidOp("Unsupported class type parameters"), readPos, readPos); + var params = parseParams(); var extend = null; var implement = []; @@ -1009,6 +1026,20 @@ class Parser { extend : extend, implement : implement, fields : fields, + isPrivate : isPrivate, + isExtern : isExtern, + }); + case "typedef": + var name = getIdent(); + var params = parseParams(); + ensureToken(TOp("=")); + var t = parseType(); + return DTypedef({ + name : name, + meta : meta, + params : params, + isPrivate : isPrivate, + t : t, }); default: unexpected(TId(ident));