5 |
|
|
6 |
|
|
7 |
_SPACJE [ \t] |
_SPACJE [ \t] |
8 |
_KOMENTARZ [!;] |
_KOMENTARZ "!" |
9 |
|
_PRZECINEK "," |
10 |
|
|
11 |
_ETYKIETA [a-zA-Z][a-zA-Z0-9_]* |
_ETYKIETA [a-zA-Z][a-zA-Z0-9_]* |
12 |
_LICZBA [0-9]+|"0x"[0-9]+ |
_LICZBA [0-9]+|"0x"[0-9a-fA-F]+ |
13 |
|
|
14 |
|
_REJESTR "%"(([sS][pP]|[fF][pP])|([rRgGiIoOlL][0-9]{1,2})) |
15 |
|
|
16 |
|
_HI "%"[hH][iI] |
17 |
|
_LO "%"[lL][oO] |
18 |
|
_NAWIASL "(" |
19 |
|
_NAWIASP ")" |
20 |
|
|
21 |
|
_ALNUM {_ETYKIETA} |
22 |
|
_ZNAK_ROWN "=" |
23 |
|
|
24 |
_ASCII ".ascii" |
_ASCII ".ascii" |
25 |
_TEXT ".text" |
_TEXT ".text" |
26 |
_ALIGN ".align" |
_ALIGN ".align" |
27 |
_DATA ".data" |
_DATA ".data" |
28 |
_SKIP ".skip" |
_SKIP ".skip" |
29 |
|
_BYTE ".byte" |
30 |
|
_HALF ".half" |
31 |
|
_WORD ".word" |
32 |
|
|
33 |
|
_B_BN "bn" |
34 |
|
_B_BE "be"|"bz" |
35 |
|
_B_BLE "ble" |
36 |
|
_B_BL "bl" |
37 |
|
_B_BLEU "bleu" |
38 |
|
_B_BCS "bcs"|"blu" |
39 |
|
_B_BNEG "bneg" |
40 |
|
_B_BVS "bvs" |
41 |
|
_B_BA "ba" |
42 |
|
_B_BNE "bne"|"bnz" |
43 |
|
_B_BG "bg" |
44 |
|
_B_BGE "bge" |
45 |
|
_B_BGU "bgu" |
46 |
|
_B_BCC "bcc"|"bgeu" |
47 |
|
_B_BPOS "bpos" |
48 |
|
_B_BVC "bvc" |
49 |
|
|
50 |
|
_R_ADD "add" |
51 |
|
_R_AND "and" |
52 |
|
_R_OR "or" |
53 |
|
_R_XOR "xor" |
54 |
|
_R_SUB "sub" |
55 |
|
_R_ANDN "andn" |
56 |
|
_R_ORN "orn" |
57 |
|
_R_XNOR "xnor" |
58 |
|
_R_ADDX "addx" |
59 |
|
_R_SUBX "subx" |
60 |
|
_R_ADDCC "addcc" |
61 |
|
_R_ANDCC "andcc" |
62 |
|
_R_ORCC "orcc" |
63 |
|
_R_XORCC "xorcc" |
64 |
|
_R_SUBCC "subcc" |
65 |
|
_R_ANDNCC "andncc" |
66 |
|
_R_ORNCC "orncc" |
67 |
|
_R_XNORCC "xnorcc" |
68 |
|
_R_ADDXCC "addxcc" |
69 |
|
_R_SUBXCC "subxcc" |
70 |
|
_R_SLL "sll" |
71 |
|
_R_SRL "srl" |
72 |
|
_R_SRA "sra" |
73 |
|
_R_JMPL "jmpl" |
74 |
|
_R_SAVE "save" |
75 |
|
_R_RESTORE "restore" |
76 |
|
_R_SETHI "sethi" |
77 |
|
_R_CALL "call" |
78 |
|
_R_LD "ld" |
79 |
|
_R_LDUB "ldub" |
80 |
|
_R_LDUH "lduh" |
81 |
|
_R_ST "st" |
82 |
|
_R_STB "stb" |
83 |
|
_R_STH "sth" |
84 |
|
_R_LDSB "ldsb" |
85 |
|
_R_LDSH "ldsh" |
86 |
|
_R_LDSTUB "ldstub" |
87 |
|
_R_SWAP "swap" |
88 |
|
|
89 |
|
_PR_MOV "mov" |
90 |
|
_PR_CMP "cmp" |
91 |
|
_PR_TST "tst" |
92 |
|
_PR_NOT "not" |
93 |
|
_PR_NEG "neg" |
94 |
|
_PR_INC "inc" |
95 |
|
_PR_DEC "dec" |
96 |
|
_PR_CLR "clr" |
97 |
|
_PR_RET "ret" |
98 |
|
_PR_JMP "jmp" |
99 |
|
_PR_SKIPZ "skipz" |
100 |
|
_PR_SKIPNZ "skipnz" |
101 |
|
_PR_SET "set" |
102 |
|
_PR_NOP "nop" |
103 |
|
|
|
_PSEUDOR mov|cmp|tst|not|neg|inc|dec|clr|restore|ret|jmp|skipz|skipnz|set|nop |
|
104 |
|
|
105 |
%{ |
%{ |
106 |
|
|
107 |
#include "zmienne.h" |
#include "zmienne.h" |
108 |
#include "stale.h" |
#include "stale.h" |
109 |
#include "funkcje.h" |
#include "funkcje.h" |
110 |
|
#include "rozkazy.h" |
111 |
|
|
112 |
#include <string.h> |
#include <string.h> |
113 |
#include "spasm.tab.h" |
#include "spasm.tab.h" |
120 |
^{_SPACJE}*{_KOMENTARZ}+.*[^\n] /* ...i komentarze */ |
^{_SPACJE}*{_KOMENTARZ}+.*[^\n] /* ...i komentarze */ |
121 |
|
|
122 |
{_ETYKIETA}":" return (ETYKIETA); |
{_ETYKIETA}":" return (ETYKIETA); |
|
{_PSEUDOR} return (PSEUDO_R); |
|
123 |
|
|
124 |
{_LICZBA} yylval.lcalk = strtol(yytext, NULL, 0); return (LICZBA); |
|
125 |
|
{_B_BN}{_SPACJE} yylval.lcalk = CND_BN; return (B_BN); |
126 |
|
{_B_BE}{_SPACJE} yylval.lcalk = CND_BE; return (B_BE); |
127 |
|
{_B_BLE}{_SPACJE} yylval.lcalk = CND_BLE; return (B_BLE); |
128 |
|
{_B_BL}{_SPACJE} yylval.lcalk = CND_BL; return (B_BL); |
129 |
|
{_B_BLEU}{_SPACJE} yylval.lcalk = CND_BLEU;return (B_BLEU); |
130 |
|
{_B_BCS}{_SPACJE} yylval.lcalk = CND_BCS; return (B_BCS); |
131 |
|
{_B_BNEG}{_SPACJE} yylval.lcalk = CND_BNEG;return (B_BNEG); |
132 |
|
{_B_BVS}{_SPACJE} yylval.lcalk = CND_BVS; return (B_BVS); |
133 |
|
{_B_BA}{_SPACJE} yylval.lcalk = CND_BA; return (B_BA); |
134 |
|
{_B_BNE}{_SPACJE} yylval.lcalk = CND_BNE; return (B_BNE); |
135 |
|
{_B_BG}{_SPACJE} yylval.lcalk = CND_BG; return (B_BG); |
136 |
|
{_B_BGE}{_SPACJE} yylval.lcalk = CND_BGE; return (B_BGE); |
137 |
|
{_B_BGU}{_SPACJE} yylval.lcalk = CND_BGU; return (B_BGU); |
138 |
|
{_B_BCC}{_SPACJE} yylval.lcalk = CND_BCC; return (B_BCC); |
139 |
|
{_B_BPOS}{_SPACJE} yylval.lcalk = CND_BPOS;return (B_BPOS); |
140 |
|
{_B_BVC}{_SPACJE} yylval.lcalk = CND_BVC; return (B_BVC); |
141 |
|
|
142 |
|
{_R_ADD}{_SPACJE} yylval.lcalk = OPC_ADD; return(R_ADD); |
143 |
|
{_R_AND}{_SPACJE} yylval.lcalk = OPC_AND; return(R_AND); |
144 |
|
{_R_OR}{_SPACJE} yylval.lcalk = OPC_OR; return(R_OR); |
145 |
|
{_R_XOR}{_SPACJE} yylval.lcalk = OPC_XOR; return(R_XOR); |
146 |
|
{_R_SUB}{_SPACJE} yylval.lcalk = OPC_SUB; return(R_SUB); |
147 |
|
{_R_ANDN}{_SPACJE} yylval.lcalk = OPC_ANDN; return(R_ANDN); |
148 |
|
{_R_ORN}{_SPACJE} yylval.lcalk = OPC_ORN; return(R_ORN); |
149 |
|
{_R_XNOR}{_SPACJE} yylval.lcalk = OPC_XNOR; return(R_XNOR); |
150 |
|
{_R_ADDX}{_SPACJE} yylval.lcalk = OPC_ADDX; return(R_ADDX); |
151 |
|
{_R_SUBX}{_SPACJE} yylval.lcalk = OPC_SUBX; return(R_SUBX); |
152 |
|
{_R_ADDCC}{_SPACJE} yylval.lcalk = OPC_ADDCC; return(R_ADDCC); |
153 |
|
{_R_ANDCC}{_SPACJE} yylval.lcalk = OPC_ANDCC; return(R_ANDCC); |
154 |
|
{_R_ORCC}{_SPACJE} yylval.lcalk = OPC_ORCC; return(R_ORCC); |
155 |
|
{_R_XORCC}{_SPACJE} yylval.lcalk = OPC_XORCC; return(R_XORCC); |
156 |
|
{_R_SUBCC}{_SPACJE} yylval.lcalk = OPC_SUBCC; return(R_SUBCC); |
157 |
|
{_R_ANDNCC}{_SPACJE} yylval.lcalk = OPC_ANDNCC; return(R_ANDNCC); |
158 |
|
{_R_ORNCC}{_SPACJE} yylval.lcalk = OPC_ORNCC; return(R_ORNCC); |
159 |
|
{_R_XNORCC}{_SPACJE} yylval.lcalk = OPC_XNORCC; return(R_XNORCC); |
160 |
|
{_R_ADDXCC}{_SPACJE} yylval.lcalk = OPC_ADDXCC; return(R_ADDXCC); |
161 |
|
{_R_SUBXCC}{_SPACJE} yylval.lcalk = OPC_SUBXCC; return(R_SUBXCC); |
162 |
|
{_R_SLL}{_SPACJE} yylval.lcalk = OPC_SLL; return(R_SLL); |
163 |
|
{_R_SRL}{_SPACJE} yylval.lcalk = OPC_SRL; return(R_SRL); |
164 |
|
{_R_SRA}{_SPACJE} yylval.lcalk = OPC_SRA; return(R_SRA); |
165 |
|
{_R_JMPL}{_SPACJE} yylval.lcalk = OPC_JMPL; return(R_JMPL); |
166 |
|
{_R_SAVE}{_SPACJE} yylval.lcalk = OPC_SAVE; return(R_SAVE); |
167 |
|
{_R_RESTORE}{_SPACJE}* yylval.lcalk = OPC_RESTORE; return(R_RESTORE); |
168 |
|
{_R_SETHI}{_SPACJE} return(R_SETHI); |
169 |
|
{_R_CALL}{_SPACJE} return(R_CALL); |
170 |
|
{_R_LD}{_SPACJE} yylval.lcalk = OPC_LD; return(R_LD); |
171 |
|
{_R_LDUB}{_SPACJE} yylval.lcalk = OPC_LDUB; return(R_LDUB); |
172 |
|
{_R_LDUH}{_SPACJE} yylval.lcalk = OPC_LDUH; return(R_LDUH); |
173 |
|
{_R_ST}{_SPACJE} yylval.lcalk = OPC_ST; return(R_ST); |
174 |
|
{_R_STB}{_SPACJE} yylval.lcalk = OPC_STB; return(R_STB); |
175 |
|
{_R_STH}{_SPACJE} yylval.lcalk = OPC_STH; return(R_STH); |
176 |
|
{_R_LDSB}{_SPACJE} yylval.lcalk = OPC_LDSB; return(R_LDSB); |
177 |
|
{_R_LDSH}{_SPACJE} yylval.lcalk = OPC_LDSH; return(R_LDSH); |
178 |
|
{_R_LDSTUB}{_SPACJE} yylval.lcalk = OPC_LDSTUB; return(R_LDSTUB); |
179 |
|
{_R_SWAP}{_SPACJE} yylval.lcalk = OPC_SWAP; return(R_SWAP); |
180 |
|
|
181 |
|
{_PR_MOV}{_SPACJE} return(PR_MOV); |
182 |
|
{_PR_CMP}{_SPACJE} return(PR_CMP); |
183 |
|
{_PR_TST}{_SPACJE} return(PR_TST); |
184 |
|
{_PR_NOT}{_SPACJE} return(PR_NOT); |
185 |
|
{_PR_NEG}{_SPACJE} return(PR_NEG); |
186 |
|
{_PR_INC}{_SPACJE} return(PR_INC); |
187 |
|
{_PR_DEC}{_SPACJE} return(PR_DEC); |
188 |
|
{_PR_CLR}{_SPACJE} return(PR_CLR); |
189 |
|
{_PR_RET}{_SPACJE}* return(PR_RET); |
190 |
|
{_PR_JMP}{_SPACJE} return(PR_JMP); |
191 |
|
{_PR_SKIPZ}{_SPACJE}* return(PR_SKIPZ); |
192 |
|
{_PR_SKIPNZ}{_SPACJE}* return(PR_SKIPNZ); |
193 |
|
{_PR_SET}{_SPACJE} return(PR_SET); |
194 |
|
{_PR_NOP}{_SPACJE}* return(PR_NOP); |
195 |
|
|
196 |
|
|
197 |
|
|
198 |
|
|
199 |
|
{_ALNUM} return (CIAG_ALNUM); |
200 |
|
{_ZNAK_ROWN} return (ZNAK_ROWN); |
201 |
|
|
202 |
|
{_LICZBA} yylval.lcalk = strtoul(yytext, NULL, 0); return (LICZBA); |
203 |
|
|
204 |
"'" { /* ciągi po ".ascii" muszą się zawierać w |
"'" { /* ciągi po ".ascii" muszą się zawierać w |
205 |
cudzysłowach '' */ |
cudzysłowach '' */ |
259 |
{_ALIGN} return (ALIGN); |
{_ALIGN} return (ALIGN); |
260 |
{_DATA} return (DATA); |
{_DATA} return (DATA); |
261 |
{_SKIP} return (SKIP); |
{_SKIP} return (SKIP); |
262 |
|
{_BYTE} return (BYTE); |
263 |
|
{_HALF} return (HALF); |
264 |
|
{_WORD} return (WORD); |
265 |
|
|
266 |
|
{_PRZECINEK} return (PRZECINEK); |
267 |
|
|
268 |
|
{_REJESTR} { |
269 |
|
int ileDodac = 0; |
270 |
|
int wartosc = 0; |
271 |
|
|
272 |
|
++yytext; //przechodzimy "%" |
273 |
|
|
274 |
|
if (strncasecmp(yytext,"fp",2) == 0) |
275 |
|
yylval.lcalk = 30; // %fp == %r30 |
276 |
|
else if (strncasecmp(yytext,"sp",2) == 0) |
277 |
|
yylval.lcalk = 14; // %sp == %r14 |
278 |
|
else |
279 |
|
{ |
280 |
|
//mamy pojedynczą literkę oraz cyfry(ę) |
281 |
|
// po niej - numer rejestru |
282 |
|
wartosc = (int) strtol(yytext+1,NULL,0); |
283 |
|
if (*yytext == 'r' || *yytext == 'R') |
284 |
|
{ |
285 |
|
if (wartosc > 31) |
286 |
|
yylval.lcalk = 0xFF; |
287 |
|
else |
288 |
|
yylval.lcalk = wartosc; |
289 |
|
} |
290 |
|
else |
291 |
|
{ |
292 |
|
if (wartosc > 7) |
293 |
|
yylval.lcalk = 0xFF; |
294 |
|
else |
295 |
|
{ |
296 |
|
//lecimy dalej |
297 |
|
switch ((char) *yytext) |
298 |
|
{ |
299 |
|
case 'o': |
300 |
|
case 'O': ileDodac = 8; |
301 |
|
break; |
302 |
|
case 'l': |
303 |
|
case 'L': ileDodac = 16; |
304 |
|
break; |
305 |
|
case 'i': |
306 |
|
case 'I': ileDodac = 24; |
307 |
|
break; |
308 |
|
} |
309 |
|
yylval.lcalk = wartosc + ileDodac; |
310 |
|
} |
311 |
|
} |
312 |
|
} |
313 |
|
return (REJESTR); |
314 |
|
} |
315 |
|
|
316 |
|
{_HI} return (HI); |
317 |
|
{_LO} return (LO); |
318 |
|
{_NAWIASL} return (NAWIASL); |
319 |
|
{_NAWIASP} return (NAWIASP); |
320 |
|
|
321 |
|
|
322 |
|
|
323 |
|
|
324 |
{_KOMENTARZ}+.*[^\n] /* komentarze po jakiejś komendzie/dyrektywie... */ |
{_KOMENTARZ}+.*[^\n] /* komentarze po jakiejś komendzie/dyrektywie... */ |
325 |
{_SPACJE}+ /* zbędne spacje */ |
{_SPACJE}+ /* zbędne spacje */ |
326 |
|
|
327 |
\n ++numerLinii; return (NLINIA); |
\n ++numerLinii; return (NLINIA); |
328 |
. { yyerror("ze co??"); exit(1); } |
. { return ((char) *yytext); } |
329 |
|
|