Mercurial > projects > dil
comparison trunk/src/dil/parser/Parser.d @ 769:5e3ef1b2011c
Added and improved documentation.
author | Aziz K?ksal <aziz.koeksal@gmail.com> |
---|---|
date | Sun, 17 Feb 2008 02:21:55 +0100 |
parents | 1771398583fa |
children | 846044180d22 |
comparison
equal
deleted
inserted
replaced
768:d84349a60f5c | 769:5e3ef1b2011c |
---|---|
705 return linkageType; | 705 return linkageType; |
706 } | 706 } |
707 | 707 |
708 auto identTok = requireId(); | 708 auto identTok = requireId(); |
709 | 709 |
710 ID identID = identTok ? identTok.ident.identID : ID.Null; | 710 IDK idKind = identTok ? identTok.ident.idKind : IDK.Null; |
711 | 711 |
712 switch (identID) | 712 switch (idKind) |
713 { | 713 { |
714 case ID.C: | 714 case IDK.C: |
715 if (consumed(T.PlusPlus)) | 715 if (consumed(T.PlusPlus)) |
716 { | 716 { |
717 linkageType = LinkageType.Cpp; | 717 linkageType = LinkageType.Cpp; |
718 break; | 718 break; |
719 } | 719 } |
720 linkageType = LinkageType.C; | 720 linkageType = LinkageType.C; |
721 break; | 721 break; |
722 case ID.D: | 722 case IDK.D: |
723 linkageType = LinkageType.D; | 723 linkageType = LinkageType.D; |
724 break; | 724 break; |
725 case ID.Windows: | 725 case IDK.Windows: |
726 linkageType = LinkageType.Windows; | 726 linkageType = LinkageType.Windows; |
727 break; | 727 break; |
728 case ID.Pascal: | 728 case IDK.Pascal: |
729 linkageType = LinkageType.Pascal; | 729 linkageType = LinkageType.Pascal; |
730 break; | 730 break; |
731 case ID.System: | 731 case IDK.System: |
732 linkageType = LinkageType.System; | 732 linkageType = LinkageType.System; |
733 break; | 733 break; |
734 default: | 734 default: |
735 error(MID.UnrecognizedLinkageType, token.srcText); | 735 error(MID.UnrecognizedLinkageType, token.srcText); |
736 } | 736 } |
2154 nT(); | 2154 nT(); |
2155 assert(token.kind == T.LParen); | 2155 assert(token.kind == T.LParen); |
2156 nT(); | 2156 nT(); |
2157 auto condition = requireIdentifier(MSG.ExpectedScopeIdentifier); | 2157 auto condition = requireIdentifier(MSG.ExpectedScopeIdentifier); |
2158 if (condition) | 2158 if (condition) |
2159 switch (condition.identID) | 2159 switch (condition.idKind) |
2160 { | 2160 { |
2161 case ID.exit, ID.success, ID.failure: | 2161 case IDK.exit, IDK.success, IDK.failure: |
2162 break; | 2162 break; |
2163 default: | 2163 default: |
2164 error(this.prevToken, MSG.InvalidScopeIdentifier, this.prevToken.srcText); | 2164 error(this.prevToken, MSG.InvalidScopeIdentifier, this.prevToken.srcText); |
2165 } | 2165 } |
2166 require(T.RParen); | 2166 require(T.RParen); |
2567 { | 2567 { |
2568 case T.Byte, T.Short, T.Int, | 2568 case T.Byte, T.Short, T.Int, |
2569 T.Float, T.Double, T.Real: | 2569 T.Float, T.Double, T.Real: |
2570 goto LAsmTypePrefix; | 2570 goto LAsmTypePrefix; |
2571 case T.Identifier: | 2571 case T.Identifier: |
2572 switch (token.ident.identID) | 2572 switch (token.ident.idKind) |
2573 { | 2573 { |
2574 case ID.near, ID.far,/* "byte", "short", "int",*/ | 2574 case IDK.near, IDK.far,/* "byte", "short", "int",*/ |
2575 ID.word, ID.dword, ID.qword/*, "float", "double", "real"*/: | 2575 IDK.word, IDK.dword, IDK.qword/*, "float", "double", "real"*/: |
2576 LAsmTypePrefix: | 2576 LAsmTypePrefix: |
2577 nT(); | 2577 nT(); |
2578 if (token.kind == T.Identifier && token.ident is Ident.ptr) | 2578 if (token.kind == T.Identifier && token.ident is Ident.ptr) |
2579 nT(); | 2579 nT(); |
2580 else | 2580 else |
2581 error(MID.ExpectedButFound, "ptr", token.srcText); | 2581 error(MID.ExpectedButFound, "ptr", token.srcText); |
2582 e = new AsmTypeExpression(parseAsmExpression()); | 2582 e = new AsmTypeExpression(parseAsmExpression()); |
2583 break; | 2583 break; |
2584 case ID.offset: | 2584 case IDK.offset: |
2585 nT(); | 2585 nT(); |
2586 e = new AsmOffsetExpression(parseAsmExpression()); | 2586 e = new AsmOffsetExpression(parseAsmExpression()); |
2587 break; | 2587 break; |
2588 case ID.seg: | 2588 case IDK.seg: |
2589 nT(); | 2589 nT(); |
2590 e = new AsmSegExpression(parseAsmExpression()); | 2590 e = new AsmSegExpression(parseAsmExpression()); |
2591 break; | 2591 break; |
2592 default: | 2592 default: |
2593 goto LparseAsmPrimaryExpression; | 2593 goto LparseAsmPrimaryExpression; |
2650 require(T.RBracket); | 2650 require(T.RBracket); |
2651 e = new AsmBracketExpression(e); | 2651 e = new AsmBracketExpression(e); |
2652 break; | 2652 break; |
2653 case T.Identifier: | 2653 case T.Identifier: |
2654 auto register = token.ident; | 2654 auto register = token.ident; |
2655 switch (register.identID) | 2655 switch (register.idKind) |
2656 { | 2656 { |
2657 // __LOCAL_SIZE | 2657 // __LOCAL_SIZE |
2658 case ID.__LOCAL_SIZE: | 2658 case IDK.__LOCAL_SIZE: |
2659 nT(); | 2659 nT(); |
2660 e = new AsmLocalSizeExpression(); | 2660 e = new AsmLocalSizeExpression(); |
2661 break; | 2661 break; |
2662 // Register | 2662 // Register |
2663 case ID.ST: | 2663 case IDK.ST: |
2664 nT(); | 2664 nT(); |
2665 // (1) - (7) | 2665 // (1) - (7) |
2666 int number = -1; | 2666 int number = -1; |
2667 if (consumed(T.LParen)) | 2667 if (consumed(T.LParen)) |
2668 { | 2668 { |
2672 expected(T.Int32); | 2672 expected(T.Int32); |
2673 require(T.RParen); | 2673 require(T.RParen); |
2674 } | 2674 } |
2675 e = new AsmRegisterExpression(register, number); | 2675 e = new AsmRegisterExpression(register, number); |
2676 break; | 2676 break; |
2677 case ID.FS: | 2677 case IDK.FS: |
2678 nT(); | 2678 nT(); |
2679 // TODO: is the colon-number part optional? | 2679 // TODO: is the colon-number part optional? |
2680 int number = -1; | 2680 int number = -1; |
2681 if (consumed(T.Colon)) | 2681 if (consumed(T.Colon)) |
2682 { | 2682 { |
2686 if (number != 0 && number != 4 && number != 8) | 2686 if (number != 0 && number != 4 && number != 8) |
2687 error(MID.ExpectedButFound, "0, 4 or 8", token.srcText); | 2687 error(MID.ExpectedButFound, "0, 4 or 8", token.srcText); |
2688 } | 2688 } |
2689 e = new AsmRegisterExpression(register, number); | 2689 e = new AsmRegisterExpression(register, number); |
2690 break; | 2690 break; |
2691 case ID.AL, ID.AH, ID.AX, ID.EAX, | 2691 case IDK.AL, IDK.AH, IDK.AX, IDK.EAX, |
2692 ID.BL, ID.BH, ID.BX, ID.EBX, | 2692 IDK.BL, IDK.BH, IDK.BX, IDK.EBX, |
2693 ID.CL, ID.CH, ID.CX, ID.ECX, | 2693 IDK.CL, IDK.CH, IDK.CX, IDK.ECX, |
2694 ID.DL, ID.DH, ID.DX, ID.EDX, | 2694 IDK.DL, IDK.DH, IDK.DX, IDK.EDX, |
2695 ID.BP, ID.EBP, ID.SP, ID.ESP, | 2695 IDK.BP, IDK.EBP, IDK.SP, IDK.ESP, |
2696 ID.DI, ID.EDI, ID.SI, ID.ESI, | 2696 IDK.DI, IDK.EDI, IDK.SI, IDK.ESI, |
2697 ID.ES, ID.CS, ID.SS, ID.DS, ID.GS, | 2697 IDK.ES, IDK.CS, IDK.SS, IDK.DS, IDK.GS, |
2698 ID.CR0, ID.CR2, ID.CR3, ID.CR4, | 2698 IDK.CR0, IDK.CR2, IDK.CR3, IDK.CR4, |
2699 ID.DR0, ID.DR1, ID.DR2, ID.DR3, ID.DR6, ID.DR7, | 2699 IDK.DR0, IDK.DR1, IDK.DR2, IDK.DR3, IDK.DR6, IDK.DR7, |
2700 ID.TR3, ID.TR4, ID.TR5, ID.TR6, ID.TR7, | 2700 IDK.TR3, IDK.TR4, IDK.TR5, IDK.TR6, IDK.TR7, |
2701 ID.MM0, ID.MM1, ID.MM2, ID.MM3, | 2701 IDK.MM0, IDK.MM1, IDK.MM2, IDK.MM3, |
2702 ID.MM4, ID.MM5, ID.MM6, ID.MM7, | 2702 IDK.MM4, IDK.MM5, IDK.MM6, IDK.MM7, |
2703 ID.XMM0, ID.XMM1, ID.XMM2, ID.XMM3, | 2703 IDK.XMM0, IDK.XMM1, IDK.XMM2, IDK.XMM3, |
2704 ID.XMM4, ID.XMM5, ID.XMM6, ID.XMM7: | 2704 IDK.XMM4, IDK.XMM5, IDK.XMM6, IDK.XMM7: |
2705 nT(); | 2705 nT(); |
2706 e = new AsmRegisterExpression(register); | 2706 e = new AsmRegisterExpression(register); |
2707 break; | 2707 break; |
2708 default: | 2708 default: |
2709 e = parseIdentifierExpression(); | 2709 e = parseIdentifierExpression(); |