Diff
Not logged in

Differences From Artifact [25ec86a59533b939]:

To Artifact [71d187282fb3ce05]:


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