@@ -11,17 +11,15 @@ import polemy.ast; import polemy.layer; /// Parse a string and return its AST -/// Throws: ParseException, LexException, UnexpectedEOF AST parseString(S, T...)(S str, T fn_ln_cn) { return parserFromString(str, fn_ln_cn).parse(); } /// Parse the content of a file and return its AST -/// Throws: ParseException, LexException, UnexpectedEOF AST parseFile(S, T...)(S filename, T ln_cn) { return parserFromFile(filename, ln_cn).parse(); @@ -74,18 +72,18 @@ /// | ["@" "@" Layer "=" Expression ([";"|"in"] Body?)? /// | ["@" "@" Layer "(" Param%"," ")" "{" Body "}" ([";"|"in"] Body?)? auto pos = currentPosition(); - string layer = ""; - bool layerRiseDecl = false; + Layer layer = ""; + bool layerLiftDecl = false; if( tryEat("@") ) { layer = "@" ~ eatId("after @", AllowQuoted); if( layer == "@@" ) { layer = "@" ~ eatId("after @@", AllowQuoted); - layerRiseDecl = true; + layerLiftDecl = true; } else { if( tryEat("(") ) @@ -93,9 +91,9 @@ } } // [TODO] Refactor - if( layerRiseDecl ) + if( layerLiftDecl ) { string kwd = "@" ~ layer; string var = layer; @@ -104,9 +102,11 @@ : (eat("=", "after "~kwd), E(0)); // let var = ... if( moreDeclarationExists() ) return new LetExpression(pos, var, SystemLayer, e, Body()); else - return new LetExpression(pos, var, SystemLayer, e, new VarExpression(pos, var)); + return new LetExpression(pos, var, SystemLayer, e, + new LayeredExpression(pos, SystemLayer, new VarExpression(pos, var)) + ); } else { string kwd = layer; @@ -392,9 +392,9 @@ } AST doNothingExpression() { - return new IntLiteral(currentPosition(), BigInt(178)); + return new StrLiteral(currentPosition(), "(empty function body)"); } immutable(LexPosition) currentPosition() { @@ -419,19 +419,19 @@ assert_eq(parseString(`def x=1`), let("x","",intl(1),var("x"))); assert_eq(parseString(`@val x=1;`), let("x","@val",intl(1),var("x"))); assert_eq(parseString(`@typ x="#int";`), let("x","@typ",strl("#int"),var("x"))); assert_eq(parseString(`f(1,2)`), call(var("f"),intl(1),intl(2))); - assert_eq(parseString(`if(1){2}`), call(var("if"),intl(1),fun([],intl(2)),fun([],intl(178)))); + assert_eq(parseString(`if(1){2}`), call(var("if"),intl(1),fun([],intl(2)),fun([],strl("(empty function body)")))); assert_eq(parseString(`if(1){2}else{3}`), call(var("if"),intl(1),fun([],intl(2)),fun([],intl(3)))); assert_eq(parseString(`if(1){}else{3}()()`), - call(call(call(var("if"),intl(1),fun([],intl(178)),fun([],intl(3)))))); + call(call(call(var("if"),intl(1),fun([],strl("(empty function body)")),fun([],intl(3)))))); assert_eq(parseString(`1+2*3`), call(var("+"),intl(1),call(var("*"),intl(2),intl(3)))); assert_eq(parseString(`(1+2)*3`), call(var("*"),call(var("+"),intl(1),intl(2)),intl(3))); assert_eq(parseString(`1*(2+3)`), call(var("*"),intl(1),call(var("+"),intl(2),intl(3)))); assert_eq(parseString(`1*2+3`), call(var("+"),call(var("*"),intl(1),intl(2)),intl(3))); assert_eq(parseString(`@x(1)`), lay("@x", intl(1))); assert_eq(parseString(`fun(x @v @t, y, z @t){}`), - funp([param("x",["@v","@t"]), param("y",[]), param("z",["@t"])], intl(178))); + funp([param("x",["@v","@t"]), param("y",[]), param("z",["@t"])], strl("(empty function body)"))); assert_eq(parseString(` let x = 100; #comment let y = 200; #comment!!!!! @@ -475,9 +475,9 @@ var("foo")) ); assert_eq(parseString(`@@type ( x ) { x }`), - let("@type", SystemLayer, fun(["x"], var("x")), var("@type")) ); + let("@type", SystemLayer, fun(["x"], var("x")), lay(SystemLayer, var("@type"))) ); assert_eq(parseString(`{}`), call(var("{}"))); assert_eq(parseString(`{foo:1,"bar":2}`), call(var(".="), call(var(".="), call(var("{}")), strl("foo"), intl(1)), strl("bar"), intl(2)));