Diff
Not logged in

Differences From Artifact [25ec86a59533b939]:

To Artifact [71d187282fb3ce05]:


5 5 * Parser for Polemy programming language 6 6 */ 7 7 module polemy.parse; 8 8 import polemy._common; 9 9 import polemy.failure; 10 10 import polemy.lex; 11 11 import polemy.ast; 12 +import polemy.layer; 12 13 13 14 /// Parse a string and return its AST 14 15 /// Throws: ParseException, LexException, UnexpectedEOF 15 16 16 17 AST parseString(S, T...)(S str, T fn_ln_cn) 17 18 { 18 19 return parserFromString(str, fn_ln_cn).parse(); ................................................................................ 98 99 string kwd = "@" ~ layer; 99 100 string var = layer; 100 101 101 102 auto e = tryEat("(") 102 103 ? parseLambdaAfterOpenParen(pos) // let var ( ... 103 104 : (eat("=", "after "~kwd), E(0)); // let var = ... 104 105 if( moreDeclarationExists() ) 105 - return new LetExpression(pos, var, "(system)", e, Body()); 106 + return new LetExpression(pos, var, SystemLayer, e, Body()); 106 107 else 107 - return new LetExpression(pos, var, "(system)", e, new VarExpression(pos, var)); 108 + return new LetExpression(pos, var, SystemLayer, e, new VarExpression(pos, var)); 108 109 } 109 110 else 110 111 { 111 112 string kwd = layer; 112 113 if( layer.empty && !tryEat(kwd="let") && !tryEat(kwd="var") && !tryEat(kwd="def") ) 113 114 return null; // none of {@lay, let, var, def} occurred, it's not a declaration 114 115 ................................................................................ 471 472 assert_eq(parseString(`def foo(x) { x+1 }; foo`), 472 473 let("foo", "", 473 474 fun(["x"], call(var("+"), var("x"), intl(1))), 474 475 var("foo")) 475 476 ); 476 477 477 478 assert_eq(parseString(`@@type ( x ) { x }`), 478 - let("@type", "(system)", fun(["x"], var("x")), var("@type")) ); 479 + let("@type", SystemLayer, fun(["x"], var("x")), var("@type")) ); 479 480 480 481 assert_eq(parseString(`{}`), call(var("{}"))); 481 482 assert_eq(parseString(`{foo:1,"bar":2}`), 482 483 call(var(".="), call(var(".="), call(var("{}")), strl("foo"), intl(1)), strl("bar"), intl(2))); 483 484 assert_eq(parseString(`{}.foo`), call(var("."),call(var("{}")),strl("foo"))); 484 485 assert_eq(parseString(`{}.?foo`), call(var(".?"),call(var("{}")),strl("foo"))); 485 486 assert_eq(parseString(`x{y:1}`), call(var(".="),var("x"),strl("y"),intl(1))); 486 487 }