1 // This file is part of Visual D
2 //
3 // Visual D integrates the D programming language into Visual Studio
4 // Copyright (c) 2010-2011 by Rainer Schuetze, All Rights Reserved
5 //
6 // Distributed under the Boost Software License, Version 1.0.
7 // See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt
8 
9 module vdc.parser.iasm;
10 
11 import vdc.util;
12 import vdc.lexer;
13 import vdc.parser.engine;
14 
15 import ast = vdc.ast.all;
16 
17 class AsmInstruction
18 {
19     static Action enter(Parser p)
20     {
21         p.pushNode(new ast.AsmInstruction(p.tok));
22         return shift(p);
23     }
24 
25     static Action shift(Parser p)
26     {
27         switch(p.tok.id)
28         {
29             case TOK_EOF:
30                 return p.parseError("end of file in asm block");
31             case TOK_semicolon:
32             case TOK_rcurly:
33                 return Forward;
34             default:
35                 p.topNode!(ast.AsmInstruction).addToken(p.tok);
36                 p.pushState(&shift);
37                 return Accept;
38         }
39     }
40 }
41 
42 //-- GRAMMAR_BEGIN --
43 //AsmInstruction:
44 //    Identifier : AsmInstruction
45 //    "align" IntegerExpression
46 //    "even"
47 //    "naked"
48 //    "db" Operands
49 //    "ds" Operands
50 //    "di" Operands
51 //    "dl" Operands
52 //    "df" Operands
53 //    "dd" Operands
54 //    "de" Operands
55 //    Opcode
56 //    Opcode Operands
57 //
58 //Operands:
59 //    Operand
60 //    Operand , Operands
61 //
62 //IntegerExpression:
63 //    IntegerLiteral
64 //    Identifier
65 //
66 //Operand:
67 //    AsmExp
68 //
69 //AsmExp:
70 //    AsmLogOrExp
71 //    AsmLogOrExp ? AsmExp : AsmExp
72 //
73 //AsmLogOrExp:
74 //    AsmLogAndExp
75 //    AsmLogAndExp || AsmLogAndExp
76 //
77 //AsmLogAndExp:
78 //    AsmOrExp
79 //    AsmOrExp && AsmOrExp
80 //
81 //AsmOrExp:
82 //    AsmXorExp
83 //    AsmXorExp | AsmXorExp
84 //
85 //AsmXorExp:
86 //    AsmAndExp
87 //    AsmAndExp ^ AsmAndExp
88 //
89 //AsmAndExp:
90 //    AsmEqualExp
91 //    AsmEqualExp & AsmEqualExp
92 //
93 //AsmEqualExp:
94 //    AsmRelExp
95 //    AsmRelExp == AsmRelExp
96 //    AsmRelExp != AsmRelExp
97 //
98 //AsmRelExp:
99 //    AsmShiftExp
100 //    AsmShiftExp < AsmShiftExp
101 //    AsmShiftExp <= AsmShiftExp
102 //    AsmShiftExp > AsmShiftExp
103 //    AsmShiftExp >= AsmShiftExp
104 //
105 //AsmShiftExp:
106 //    AsmAddExp
107 //    AsmAddExp << AsmAddExp
108 //    AsmAddExp >> AsmAddExp
109 //    AsmAddExp >>> AsmAddExp
110 //
111 //AsmAddExp:
112 //    AsmMulExp
113 //    AsmMulExp + AsmMulExp
114 //    AsmMulExp - AsmMulExp
115 //
116 //AsmMulExp:
117 //    AsmBrExp
118 //    AsmBrExp * AsmBrExp
119 //    AsmBrExp / AsmBrExp
120 //    AsmBrExp % AsmBrExp
121 //
122 //AsmBrExp:
123 //    AsmUnaExp
124 //    AsmBrExp [ AsmExp ]
125 //
126 //AsmUnaExp:
127 //    AsmTypePrefix AsmExp
128 //    "offsetof" AsmExp
129 //    "seg" AsmExp
130 //    + AsmUnaExp
131 //    - AsmUnaExp
132 //    ! AsmUnaExp
133 //    ~ AsmUnaExp
134 //    AsmPrimaryExp
135 //
136 //AsmPrimaryExp:
137 //    IntegerLiteral
138 //    FloatLiteral
139 //    "__LOCAL_SIZE"
140 //    $
141 //    Register
142 //    DotIdentifier
143 //
144 //DotIdentifier:
145 //    Identifier
146 //    Identifier . DotIdentifier
147 //
148 //AsmTypePrefix:
149 //    "near"  "ptr"
150 //    "far"   "ptr"
151 //    byte    "ptr"
152 //    short   "ptr"
153 //    int     "ptr"
154 //    "word"  "ptr"
155 //    "dword" "ptr"
156 //    "qword" "ptr"
157 //    float   "ptr"
158 //    double  "ptr"
159 //    real    "ptr"
160 //
161 //Register:
162 //    TOK_register
163 //
164 //Opcode:
165 //    TOK_opcode
166 //
167 //Identifier:
168 //    TOK_Identifier
169 //
170 //Integer:
171 //    IntegerLiteral
172 //
173 //IntegerLiteral:
174 //    TOK_IntegerLiteral
175 //
176 //FloatLiteral:
177 //    TOK_FloatLiteral
178 //
179 //StringLiteral:
180 //    TOK_StringLiteral
181 //
182 //CharacterLiteral:
183 //    TOK_CharacterLiteral
184 //
185 //// removed from grammar:
186 ////
187 ////Register:
188 ////    AL AH AX EAX
189 ////    BL BH BX EBX
190 ////    CL CH CX ECX
191 ////    DL DH DX EDX
192 ////    BP EBP
193 ////    SP ESP
194 ////    DI EDI
195 ////    SI ESI
196 ////    ES CS SS DS GS FS
197 ////    CR0 CR2 CR3 CR4
198 ////    DR0 DR1 DR2 DR3 DR6 DR7
199 ////    TR3 TR4 TR5 TR6 TR7
200 ////    ST
201 ////    ST(0) ST(1) ST(2) ST(3) ST(4) ST(5) ST(6) ST(7)
202 ////    MM0 MM1 MM2 MM3 MM4 MM5 MM6 MM7
203 ////    XMM0 XMM1 XMM2 XMM3 XMM4 XMM5 XMM6 XMM7
204 ////