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 +++++++++++++++++++++++++++++/