@@ -300,28 +300,21 @@ } AST parseIfAfterIf(LexPosition pos) { - eat("(", "after if"); auto cond = E(0); - eat(")", "after if condition"); - auto thenPos = lex.front.pos; - AST th; - if( tryEat("{") ) { - th = Body(); - eat("}", "after if-then body"); - } else { - th = E(0); + auto thenPos = currentPosition(); + if(!tryEat(":")) { + eat("then", "after if condition"); + tryEat(":"); } + AST th = E(0); auto el = doNothingExpression(); - auto elsePos = (lex.empty ? LexPosition.dummy : lex.front.pos); - if( tryEat("else") ) - if( tryEat("{") ) { - el = Body(); - eat("}", "after else body"); - } else { - el = E(0); - } + auto elsePos = currentPosition(); + if( tryEat("else") ) { + tryEat(":"); + el = E(0); + } return new App(pos, new Var(pos,"if"), cond, new Fun(thenPos,[],th), new Fun(elsePos,[],el)); } AST parsePatternMatch(LexPosition pos) @@ -587,11 +580,11 @@ 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([],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}()()`), + assert_eq(parseString(`if 1 then 2`), call(var("if"),intl(1),fun([],intl(2)),fun([],strl("(empty function body)")))); + assert_eq(parseString(`if 1 then: 2 else(3)`), call(var("if"),intl(1),fun([],intl(2)),fun([],intl(3)))); + assert_eq(parseString(`(if 1 then () else 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)))); @@ -608,9 +601,9 @@ let("x", "", intl(100), let("y", "", intl(200), call(var("+"), var("x"), var("y")))) ); assert_eq(parseString(` - var fac = fun(x){ if(x <= 1) {1} else {x*fac(x-1)} }; + var fac = fun(x){ if(x <= 1) then 1 else x*fac(x-1) }; fac(10) `), let("fac", "", fun(["x"], call(var("if"), @@ -669,15 +662,4 @@ when {aaaa:@value(x)}: 1 when {aaaa:{bbb:_}, ccc:123}: 1 `)); } - -unittest -{ - // test for omitting { .. } - assert_nothrow(parseString(` - if(1) 2 else 3 - `)); - assert_nothrow(parseString(` - if(1) x{y:z} else 3 - `)); -}