Diff
Not logged in

Differences From Artifact [7ed0053850ffa032]:

To Artifact [6bec0997c5764737]:


163 ["|"], 163 ["|"], 164 ["^"], 164 ["^"], 165 ["&"], 165 ["&"], 166 ["<<", ">>"], 166 ["<<", ">>"], 167 ["+","-"], 167 ["+","-"], 168 ["~"], 168 ["~"], 169 ["*","/","%"], 169 ["*","/","%"], 170 ["^^","**"] | 170 ["^^","**"], > 171 [".",".?"] 171 ]; 172 ]; 172 173 173 AST E(size_t level) 174 AST E(size_t level) 174 { 175 { 175 /// Expression ::= (Binary left-associative operators over) Func 176 /// Expression ::= (Binary left-associative operators over) Func 176 177 177 AST rec(AST lhs) 178 AST rec(AST lhs) ................................................................................................................................................................................ 178 { 179 { 179 if( closingBracket() ) 180 if( closingBracket() ) 180 return lhs; 181 return lhs; 181 182 182 auto pos = currentPosition(); 183 auto pos = currentPosition(); 183 foreach(op; operator_perferences[level]) 184 foreach(op; operator_perferences[level]) 184 if( tryEat(op) ) 185 if( tryEat(op) ) > 186 if( op[0]=='.' ) > 187 return rec( > 188 new FuncallExpression(lh > 189 else 185 return rec( 190 return rec( 186 new FuncallExpression(lhs.pos, n 191 new FuncallExpression(lhs.pos, n 187 return lhs; 192 return lhs; 188 } 193 } 189 194 190 if( operator_perferences.length <= level ) 195 if( operator_perferences.length <= level ) 191 return Funcall(); 196 return Funcall(); ................................................................................................................................................................................ 241 return new LayeredExpression(pos, lay, e); 246 return new LayeredExpression(pos, lay, e); 242 } 247 } 243 if( tryEat("(") ) 248 if( tryEat("(") ) 244 { 249 { 245 auto e = Body(); 250 auto e = Body(); 246 eat(")", "after parenthesized expression"); 251 eat(")", "after parenthesized expression"); 247 return e; 252 return e; > 253 } > 254 if( tryEat("{") ) > 255 { > 256 AST e = new FuncallExpression(pos, new VarExpression(pos > 257 if( tryEat("}") ) > 258 return e; > 259 for(;;) > 260 { > 261 string key = eatId("for table key", AllowQuoted) > 262 eat(":", "after table key"); > 263 AST val = E(0); > 264 e = new FuncallExpression(pos, new VarExpression > 265 e, new StrLiteral(pos,key), val) > 266 if( !tryEat(",") ) > 267 { > 268 eat("}", "for the end of table literal") > 269 break; > 270 } > 271 } > 272 return e; 248 } 273 } 249 if( tryEat("if") ) 274 if( tryEat("if") ) 250 { 275 { 251 eat("(", "after if"); 276 eat("(", "after if"); 252 auto cond = E(0); 277 auto cond = E(0); 253 eat(")", "after if condition"); 278 eat(")", "after if condition"); 254 auto thenPos = lex.front.pos; 279 auto thenPos = lex.front.pos; ................................................................................................................................................................................ 273 { 298 { 274 eat("(", "after fun"); 299 eat("(", "after fun"); 275 return parseLambdaAfterOpenParen(pos); 300 return parseLambdaAfterOpenParen(pos); 276 } 301 } 277 scope(exit) lex.popFront; 302 scope(exit) lex.popFront; 278 return new VarExpression(pos, lex.front.str); 303 return new VarExpression(pos, lex.front.str); 279 } 304 } > 305 > 306 AST parseId() > 307 { > 308 scope(exit) lex.popFront; > 309 return new StrLiteral(currentPosition(), lex.front.str); > 310 } 280 311 281 AST parseLambdaAfterOpenParen(immutable LexPosition pos) 312 AST parseLambdaAfterOpenParen(immutable LexPosition pos) 282 { 313 { 283 Parameter[] params; 314 Parameter[] params; 284 while( !tryEat(")") ) 315 while( !tryEat(")") ) 285 { 316 { 286 params ~= parseParam(); 317 params ~= parseParam(); ................................................................................................................................................................................ 434 let("foo", "", 465 let("foo", "", 435 fun(["x"], call(var("+"), var("x"), intl(1))), 466 fun(["x"], call(var("+"), var("x"), intl(1))), 436 var("foo")) 467 var("foo")) 437 ); 468 ); 438 469 439 assert_eq(parseString(`@@type ( x ) { x }`), 470 assert_eq(parseString(`@@type ( x ) { x }`), 440 let("@type", "(system)", fun(["x"], var("x")), var("@type")) ); 471 let("@type", "(system)", fun(["x"], var("x")), var("@type")) ); > 472 > 473 assert_eq(parseString(`{}`), call(var("{}"))); > 474 assert_eq(parseString(`{foo:1,"bar":2}`), > 475 call(var(".="), call(var(".="), call(var("{}")), strl("foo"), in > 476 assert_eq(parseString(`{}.foo`), call(var("."),call(var("{}")),strl("foo > 477 assert_eq(parseString(`{}.?foo`), call(var(".?"),call(var("{}")),strl("f 441 } 478 }