Mercurial > projects > dil
comparison trunk/src/Parser.d @ 285:104343e0f097
- Started implementation of asm statements parser.
author | aziz |
---|---|
date | Tue, 07 Aug 2007 16:41:03 +0000 |
parents | 00c887e6c0aa |
children | 211bdd69397d |
comparison
equal
deleted
inserted
replaced
284:00c887e6c0aa | 285:104343e0f097 |
---|---|
2435 +++++++++++++++++++++++++++++/ | 2435 +++++++++++++++++++++++++++++/ |
2436 | 2436 |
2437 Statement parseAsmStatement() | 2437 Statement parseAsmStatement() |
2438 { | 2438 { |
2439 assert(token.type == T.Asm); | 2439 assert(token.type == T.Asm); |
2440 // TODO: implement asm statements parser. | 2440 nT(); // Skip asm keyword. |
2441 require(T.LBrace); | |
2442 auto ss = new Statements; | |
2443 while (token.type != T.RBrace && token.type != T.EOF) | |
2444 ss ~= parseAsmInstruction(); | |
2445 require(T.RBrace); | |
2446 return new AsmStatement(ss); | |
2447 } | |
2448 | |
2449 Statement parseAsmInstruction() | |
2450 { | |
2451 auto begin = token; | |
2452 Statement s; | |
2453 switch (token.type) | |
2454 { | |
2455 case T.Identifier: | |
2456 auto ident = token; | |
2457 auto next = peekNext(); | |
2458 if (next == T.Colon) | |
2459 { | |
2460 // Identifier : AsmInstruction | |
2461 nT(); // Skip Identifier | |
2462 nT(); // Skip : | |
2463 s = new LabeledStatement(ident, parseAsmInstruction()); | |
2464 break; | |
2465 } | |
2466 | |
2467 // Opcode ; | |
2468 // Opcode Operands ; | |
2469 // Opcode | |
2470 // Identifier | |
2471 Expression[] es; | |
2472 if (next != T.Semicolon) | |
2473 { | |
2474 while (1) | |
2475 { | |
2476 es ~= parseAsmExpression(); | |
2477 if (token.type != T.Comma) | |
2478 break; | |
2479 nT(); | |
2480 } | |
2481 } | |
2482 require(T.Semicolon); | |
2483 s = new AsmInstruction(ident, es); | |
2484 break; | |
2485 case T.Semicolon: | |
2486 s = new EmptyStatement(); | |
2487 nT(); | |
2488 break; | |
2489 default: | |
2490 error(MID.ExpectedButFound, "AsmStatement", token.srcText); | |
2491 s = new IllegalAsmInstruction(token); | |
2492 nT(); | |
2493 } | |
2494 set(s, begin); | |
2495 return s; | |
2496 } | |
2497 | |
2498 Expression parseAsmExpression() | |
2499 { | |
2441 return null; | 2500 return null; |
2501 } | |
2502 | |
2503 Expression parseAsmPrimaryExpression() | |
2504 { | |
2505 auto begin = token; | |
2506 Expression e; | |
2507 switch (token.type) | |
2508 { | |
2509 case T.Int32, T.Int64, T.Uint32, T.Uint64: | |
2510 e = new IntNumberExpression(token.type, token.ulong_); | |
2511 nT(); | |
2512 break; | |
2513 case T.Float32, T.Float64, T.Float80, | |
2514 T.Imaginary32, T.Imaginary64, T.Imaginary80: | |
2515 e = new RealNumberExpression(token.type, token.real_); | |
2516 nT(); | |
2517 break; | |
2518 case T.Dollar: | |
2519 e = new DollarExpression(); | |
2520 nT(); | |
2521 break; | |
2522 default: | |
2523 error(MID.ExpectedButFound, "Expression", token.srcText); | |
2524 e = new EmptyExpression(); | |
2525 } | |
2526 set(e, begin); | |
2527 return e; | |
2442 } | 2528 } |
2443 | 2529 |
2444 /+++++++++++++++++++++++++++++ | 2530 /+++++++++++++++++++++++++++++ |
2445 + Expression parsing methods + | 2531 + Expression parsing methods + |
2446 +++++++++++++++++++++++++++++/ | 2532 +++++++++++++++++++++++++++++/ |