forked from dmsc/fastbasic
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbasic.syn
More file actions
617 lines (528 loc) · 19.2 KB
/
Copy pathbasic.syn
File metadata and controls
617 lines (528 loc) · 19.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
#
# FastBasic - Fast basic interpreter for the Atari 8-bit computers
# Copyright (C) 2017,2018 Daniel Serpell
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program. If not, see <http://www.gnu.org/licenses/>
#
# Syntax in simplified PEG format
# -------------------------------
TOKENS {
# First token must be "END"
TOK_END
# Constant and variable loading
TOK_NUM, TOK_BYTE, TOK_CSTRING, TOK_CDATA, TOK_VAR_ADDR, TOK_VAR_LOAD
TOK_SHL8, TOK_0, TOK_1
# Numeric operators
TOK_NEG, TOK_ABS, TOK_SGN, TOK_ADD, TOK_SUB, TOK_MUL, TOK_DIV, TOK_MOD
# Bitwise operators
TOK_BIT_AND, TOK_BIT_OR, TOK_BIT_EXOR
# Functions
TOK_PEEK, TOK_DPEEK
TOK_TIME, TOK_FRE, TOK_RAND
# Boolean operators
TOK_L_NOT, TOK_L_OR, TOK_L_AND
# Comparisons
TOK_LT, TOK_GT, TOK_NEQ, TOK_EQ
# Convert from int to bool
TOK_COMP_0
# Low level statements
TOK_POKE, TOK_DPOKE, TOK_MOVE, TOK_NMOVE, TOK_INC, TOK_DEC
# Graphic support statements
TOK_GRAPHICS, TOK_PLOT, TOK_DRAWTO
# Print statements
TOK_PRINT_STR, TOK_PRINT_TAB, TOK_PRINT_EOL
# I/O
TOK_GETKEY, TOK_INPUT_STR, TOK_XIO, TOK_CLOSE, TOK_GET, TOK_PUT
TOK_BPUT, TOK_BGET
# Optimization - set's IO channel to 0
TOK_IOCHN0
# Jumps
TOK_JUMP, TOK_CJUMP, TOK_CALL, TOK_RET, TOK_CRET
# FOR loop support
TOK_FOR, TOK_FOR_START, TOK_FOR_NEXT, TOK_FOR_EXIT
# Arrays
TOK_DIM, TOK_USHL
# Strings
TOK_COPY_STR, TOK_VAL, TOK_CMP_STR, TOK_INT_STR, TOK_STR_IDX, TOK_CAT_STR, TOK_CHR
# Sound off - could be implemented as simple POKE expressions, but it's shorter this way
TOK_SOUND_OFF
TOK_PAUSE
# USR, calls ML routinr
TOK_USR_ADDR, TOK_USR_PARAM, TOK_USR_CALL
#@if FASTBASIC_FP
# Floating point computations
TOK_INT_FP, TOK_FP_VAL, TOK_FP_SGN, TOK_FP_ABS, TOK_FP_NEG, TOK_FLOAT
TOK_FP_DIV, TOK_FP_MUL, TOK_FP_SUB, TOK_FP_ADD, TOK_FP_STORE, TOK_FP_LOAD
TOK_FP_EXP, TOK_FP_EXP10, TOK_FP_LOG, TOK_FP_LOG10, TOK_FP_INT, TOK_FP_CMP
TOK_FP_IPOW, TOK_FP_RND, TOK_FP_SQRT, TOK_FP_SIN, TOK_FP_COS, TOK_FP_ATN
TOK_FP_STR
#@endif FASTBASIC_FP
}
EXTERN {
E_REM, E_NUMBER_WORD, E_NUMBER_BYTE, E_EOL
E_PUSH_LT, E_POP_LOOP, E_POP_REPEAT
E_POP_IF, E_ELSE, E_ELIF, E_EXIT_LOOP
E_POP_WHILE, E_POP_FOR, E_POP_PROC_1, E_POP_PROC_2, E_POP_DATA
E_CONST_STRING
E_VAR_CREATE, E_VAR_SET_TYPE
E_VAR_WORD, E_VAR_ARRAY_BYTE, E_VAR_ARRAY_WORD, E_VAR_STRING, E_VAR_ARRAY_STRING
E_LABEL, E_LABEL_DEF
#@if FASTBASIC_FP
E_VAR_FP, E_NUMBER_FP
#@endif FASTBASIC_FP
}
# Floating point expressions
#@if FASTBASIC_FP
FP_EXPR: floating point expression
FP_T_EXPR FP_E_EXPR_MORE FP_M_EXPR_MORE FP_EXPR_MORE
FP_EXPR_MORE:
"+" FP_T_EXPR FP_E_EXPR_MORE FP_M_EXPR_MORE emit TOK_FP_ADD FP_EXPR_MORE
"-" FP_T_EXPR FP_E_EXPR_MORE FP_M_EXPR_MORE emit TOK_FP_SUB FP_EXPR_MORE
pass
FP_M_EXPR_MORE:
"*" FP_T_EXPR FP_E_EXPR_MORE emit TOK_FP_MUL FP_M_EXPR_MORE
"/" FP_T_EXPR FP_E_EXPR_MORE emit TOK_FP_DIV FP_M_EXPR_MORE
pass
FP_E_EXPR_MORE:
"^" T_EXPR emit TOK_FP_IPOW FP_E_EXPR_MORE
"^" emit TOK_FP_LOG10 FP_T_EXPR emit TOK_FP_MUL emit TOK_FP_EXP10 FP_E_EXPR_MORE
pass
FP_T_EXPR: floating point constant, variable or function
emit TOK_FLOAT E_NUMBER_FP
"-" FP_T_EXPR emit TOK_FP_NEG
"+" FP_T_EXPR
# FP Functions
"ABS" FP_PAR_EXPR emit TOK_FP_ABS
"ATN" FP_PAR_EXPR emit TOK_FP_ATN
"SGN" FP_PAR_EXPR emit TOK_FP_SGN
"EXP10" FP_PAR_EXPR emit TOK_FP_EXP10
"EXP" FP_PAR_EXPR emit TOK_FP_EXP
"LOG10" FP_PAR_EXPR emit TOK_FP_LOG10
"LOG" FP_PAR_EXPR emit TOK_FP_LOG
"SQR" FP_PAR_EXPR emit TOK_FP_SQRT
"SIN" FP_PAR_EXPR emit TOK_FP_SIN
"COS" FP_PAR_EXPR emit TOK_FP_COS
"VAL" STR_PAR_EXPR emit TOK_FP_VAL
"RND()" emit TOK_FP_RND
FP_PAR_EXPR
emit TOK_VAR_ADDR E_VAR_FP "%" emit TOK_FP_LOAD
INT_EXPR emit TOK_INT_FP
FP_PAR_EXPR: left parenthesis
"(" FP_EXPR ")"
#@endif FASTBASIC_FP
# Normal expressions
INT_EXPR: integer expression
T_EXPR BIT_EXPR_MORE M_EXPR_MORE INT_EXPR_MORE
INT_EXPR_MORE:
"+" T_EXPR BIT_EXPR_MORE M_EXPR_MORE emit TOK_ADD INT_EXPR_MORE
"-" T_EXPR BIT_EXPR_MORE M_EXPR_MORE emit TOK_SUB INT_EXPR_MORE
pass
M_EXPR_MORE:
"*" T_EXPR BIT_EXPR_MORE emit TOK_MUL M_EXPR_MORE
"/" T_EXPR BIT_EXPR_MORE emit TOK_DIV M_EXPR_MORE
"MOD" T_EXPR BIT_EXPR_MORE emit TOK_MOD M_EXPR_MORE
pass
BIT_EXPR_MORE:
"&" T_EXPR emit TOK_BIT_AND BIT_EXPR_MORE
"!" T_EXPR emit TOK_BIT_OR BIT_EXPR_MORE
"EXOR" T_EXPR emit TOK_BIT_EXOR BIT_EXPR_MORE
pass
NEG_EXPR:
"-" T_EXPR
"+" NEG_EXPR
T_EXPR emit TOK_NEG
ADR_EXPR: string or variable
STR_EXPR
VAR_WORD_LVALUE
VAR_BYTE_LVALUE
emit TOK_VAR_LOAD E_VAR_ARRAY_WORD
emit TOK_VAR_LOAD E_VAR_ARRAY_BYTE
emit TOK_VAR_LOAD E_VAR_ARRAY_STRING
USR_EXPR_MORE:
"," EXPR emit TOK_USR_PARAM USR_EXPR_MORE
pass
T_EXPR: integer constant, variable or function
emit TOK_BYTE E_NUMBER_BYTE
emit TOK_NUM E_NUMBER_WORD
"-" NEG_EXPR
"+" T_EXPR
"NOT" NOT_EXPR emit TOK_L_NOT
# Special (predefined) variables
"TIME" emit TOK_TIME
# Variables as R-Values, push value into stack
ARRAY_WORD_ADDR emit TOK_DPEEK
VAR_BYTE_LVALUE emit TOK_PEEK
emit TOK_VAR_LOAD E_VAR_WORD
# Functions
"ABS" PAR_EXPR emit TOK_ABS
"SGN" PAR_EXPR emit TOK_SGN
"PEEK" PAR_EXPR emit TOK_PEEK
"PADDLE" emit TOK_NUM word PADDL0 emit TOK_BYTE emit 7 RD_PORT
"PTRIG" emit TOK_NUM word PTRIG0 emit TOK_BYTE emit 7 RD_PORT
"STICK" emit TOK_NUM word STICK0 emit TOK_BYTE emit 3 RD_PORT
"STRIG" emit TOK_NUM word STRIG0 emit TOK_BYTE emit 3 RD_PORT
#@if FASTBASIC_FP
"INT" FP_PAR_EXPR emit TOK_FP_INT
#@endif FASTBASIC_FP
"RAND" PAR_EXPR emit TOK_RAND
"DPEEK" PAR_EXPR emit TOK_DPEEK
"FRE()" emit TOK_FRE
"ERR()" emit TOK_BYTE emit IOERROR emit TOK_PEEK
"USR(" EXPR emit TOK_USR_ADDR USR_EXPR_MORE ")" emit TOK_USR_CALL
"ADR(" ADR_EXPR ")"
"LEN" STR_PAR_EXPR emit TOK_PEEK # First byte of string is the length
"VAL" STR_PAR_EXPR emit TOK_VAL
"ASC" STR_PAR_EXPR emit TOK_1 emit TOK_ADD emit TOK_PEEK # TODO: does not check for empty strings.
"KEY()" emit TOK_NUM word CH emit TOK_PEEK emit TOK_BYTE emit 255 emit TOK_BIT_EXOR
PAR_EXPR
# Used to handle PADDLE/STICK/PTRIG/STRIG
RD_PORT:
PAR_EXPR emit TOK_BIT_AND emit TOK_ADD emit TOK_PEEK
PAR_EXPR: left parenthesis
"(" EXPR ")"
STR_PAR_EXPR: left parenthesis
"(" STR_EXPR ")"
# Parses a continuation of an INT to BOOLean expression
OR_AND_BOOL:
OR_EXPR_RIGHT
AND_EXPR_RIGHT
# Test if an INT needs to be converted to BOOL
TEST_BOOL_EXPR:
emit TOK_COMP_0 OR_AND_BOOL
COMP_EXPR_RIGHT OR_EXPR_MORE AND_EXPR_MORE COMP_EXPR_MORE
#@if FASTBASIC_FP
emit TOK_INT_FP COMP_FP_RIGHT OR_EXPR_MORE AND_EXPR_MORE COMP_EXPR_MORE
#@endif FASTBASIC_FP
pass
# General Expression - Can be INT or BOOL
EXPR:
INT_EXPR TEST_BOOL_EXPR
STR_EXPR COMP_STR_RIGHT
#@if FASTBASIC_FP
FP_EXPR COMP_FP_RIGHT
#@endif FASTBASIC_FP
# Forced BOOL expressions, convert to BOOL always
FORCE_BOOL_EXPR:
NOT_EXPR AND_EXPR_MORE OR_EXPR_MORE
OR_EXPR_RIGHT:
"OR" NOT_EXPR AND_EXPR_MORE emit TOK_L_OR OR_EXPR_MORE
OR_EXPR_MORE:
OR_EXPR_RIGHT
pass
AND_EXPR_RIGHT:
"AND" NOT_EXPR emit TOK_L_AND AND_EXPR_MORE
AND_EXPR_MORE:
AND_EXPR_RIGHT
pass
NOT_EXPR:
"NOT" NOT_EXPR emit TOK_L_NOT
INT_EXPR COMP_OR_BOOL
#@if FASTBASIC_FP
FP_EXPR COMP_FP_RIGHT
#@endif FASTBASIC_FP
STR_EXPR COMP_STR_RIGHT
COMP_OR_BOOL:
COMP_EXPR_RIGHT COMP_EXPR_MORE
#@if FASTBASIC_FP
emit TOK_INT_FP COMP_FP_RIGHT COMP_EXPR_MORE
#@endif FASTBASIC_FP
emit TOK_COMP_0
COMP_EXPR_RIGHT:
"<=" INT_EXPR emit TOK_GT emit TOK_L_NOT
">=" INT_EXPR emit TOK_LT emit TOK_L_NOT
"<>" INT_EXPR emit TOK_NEQ
"<" INT_EXPR emit TOK_LT
">" INT_EXPR emit TOK_GT
"=" INT_EXPR emit TOK_EQ
#@if FASTBASIC_FP
# FP Comparisons:
COMP_FP_RIGHT: integer expression
"=" FP_EXPR emit TOK_FP_CMP emit TOK_EQ
">" FP_EXPR emit TOK_FP_CMP emit TOK_GT
">=" FP_EXPR emit TOK_FP_CMP emit TOK_LT emit TOK_L_NOT
"<>" FP_EXPR emit TOK_FP_CMP emit TOK_NEQ
"<=" FP_EXPR emit TOK_FP_CMP emit TOK_GT emit TOK_L_NOT
"<" FP_EXPR emit TOK_FP_CMP emit TOK_LT
#@endif FASTBASIC_FP
COMP_STR_RIGHT: integer expression
"=" STR_EXPR emit TOK_CMP_STR emit TOK_EQ
">" STR_EXPR emit TOK_CMP_STR emit TOK_GT
">=" STR_EXPR emit TOK_CMP_STR emit TOK_LT emit TOK_L_NOT
"<>" STR_EXPR emit TOK_CMP_STR emit TOK_NEQ
"<=" STR_EXPR emit TOK_CMP_STR emit TOK_GT emit TOK_L_NOT
"<" STR_EXPR emit TOK_CMP_STR emit TOK_LT
COMP_EXPR_MORE:
COMP_EXPR_RIGHT COMP_EXPR_MORE
pass
# String expressions: base plus optional index
STR_EXPR: string expression
STR_EXPR_BASE OPT_STR_INDEX
OPT_STR_INDEX:
"[" EXPR_2 "]" emit TOK_STR_IDX OPT_STR_INDEX
"[" EXPR "]" emit TOK_BYTE emit 255 emit TOK_STR_IDX OPT_STR_INDEX
pass
STR_EXPR_BASE:
# Either, a constant string
"\"" emit TOK_CSTRING E_CONST_STRING
# Or a string function
"CHR$" PAR_EXPR emit TOK_CHR
"STR$" PAR_EXPR emit TOK_INT_STR
#@if FASTBASIC_FP
"STR$" FP_PAR_EXPR emit TOK_FP_STR
#@endif FASTBASIC_FP
# Or a string variable
emit TOK_VAR_LOAD E_VAR_STRING "$"
# Or a string array
ARRAY_STRING_ADDR emit TOK_DPEEK
# Statements
PRINT_SEP:
"," emit TOK_PRINT_TAB
";"
PRINT_SEP_MORE:
PRINT_SEP PRINT_SEP_MORE
pass
#@if !FASTBASIC_FP
PRINT_ONE:
EXPR emit TOK_INT_STR emit TOK_PRINT_STR
STR_EXPR emit TOK_PRINT_STR
PRINT_EXPR:
PRINT_SEP_MORE PRINT_ONE PRINT_NEXT
emit TOK_PRINT_EOL
PRINT_NEXT:
PRINT_SEP PRINT_SEP_MORE PRINT_ONE PRINT_NEXT
PRINT_SEP PRINT_SEP_MORE emit TOK_IOCHN0
emit TOK_PRINT_EOL
#@endif !FASTBASIC_FP
#@if FASTBASIC_FP
PRINT_ONE:
EXPR emit TOK_INT_STR emit TOK_PRINT_STR PRINT_NEXT
FP_EXPR emit TOK_FP_STR emit TOK_PRINT_STR PRINT_NEXT
STR_EXPR emit TOK_PRINT_STR PRINT_NEXT
PRINT_EXPR:
PRINT_SEP_MORE PRINT_ONE
emit TOK_PRINT_EOL
PRINT_NEXT:
PRINT_SEP PRINT_SEP_MORE PRINT_ONE
PRINT_SEP PRINT_SEP_MORE emit TOK_IOCHN0
E_EOL emit TOK_PRINT_EOL
#@endif FASTBASIC_FP
# Parse multi-line IF
THEN_OR_MULTILINE:
"Then" PARSE_STATEMENT E_POP_IF
pass
VAR_CREATE_TYPE:
"$" emit VT_STRING
#@if FASTBASIC_FP
"%" emit VT_FLOAT
#@endif FASTBASIC_FP
emit VT_WORD
# Parse variable as L-VALUE, stores the *address* in the stack, this creates the
# variable if not exist.
# NOTE: the creation rule (E_VAR_SET_TYPE) always fails, so the parser uses the next
# rules using the created variable.
VAR_WORD_LVALUE: integer variable
E_VAR_CREATE VAR_CREATE_TYPE E_VAR_SET_TYPE
emit TOK_VAR_ADDR E_VAR_WORD
ARRAY_WORD_ADDR
VAR_STR_LVALUE:
emit TOK_VAR_ADDR E_VAR_STRING "$"
ARRAY_STRING_ADDR
#@if FASTBASIC_FP
VAR_FP_LVALUE:
emit TOK_VAR_ADDR E_VAR_FP "%"
#@endif FASTBASIC_FP
# Parse an "=" sign, it's own rule to skip spaces before!
EQUAL: variable assignment
"="
# Parse optional "STEP" in for
STEP_OPTIONAL:
"Step" EXPR
emit TOK_1
# Parse variable name in "NEXT"
NEXT_VARNAME:
E_VAR_WORD
E_VAR_ARRAY_WORD
emit 0 pass
# POSITION arguments, used also in PLOT, DRAWTO, LOCATE and FILLTO
POSITION:
emit TOK_BYTE emit COLCRS EXPR "," emit TOK_DPOKE emit TOK_BYTE emit ROWCRS EXPR emit TOK_POKE
# SOUND arguments, three possibilities:
# SOUND voice, freq, distort, vol
# SOUND voice
# SOUND
SOUND:
EXPR emit TOK_USHL emit TOK_NUM word AUDF1 emit TOK_ADD "," EXPR "," EXPR_AB emit TOK_SHL8 emit TOK_ADD emit TOK_DPOKE emit TOK_NUM word AUDCTL emit TOK_0 emit TOK_POKE emit TOK_NUM word SKCTL emit TOK_BYTE emit 3 emit TOK_POKE
EXPR emit TOK_USHL emit TOK_NUM word AUDF1 emit TOK_ADD emit TOK_0 emit TOK_DPOKE
emit TOK_SOUND_OFF
# Word Arrays
ARRAY_WORD_ADDR:
emit TOK_VAR_LOAD E_VAR_ARRAY_WORD PAR_EXPR emit TOK_USHL emit TOK_ADD
# String Arrays
ARRAY_STRING_ADDR:
emit TOK_VAR_LOAD E_VAR_ARRAY_STRING "$" PAR_EXPR emit TOK_USHL emit TOK_ADD
# This is the same as "ARRAY_BYTE_ADDR"
VAR_BYTE_LVALUE:
emit TOK_VAR_LOAD E_VAR_ARRAY_BYTE PAR_EXPR emit TOK_ADD
# DIM
DIM_MORE: comma
"," DIM_VAR DIM_MORE
pass
# INPUT
INPUT_STR:
IO_CHAN_COMMA # I/O channel, don't print prompt
"\"" emit TOK_CSTRING E_CONST_STRING emit TOK_PRINT_STR PRINT_SEP # Prints a given string
PRINT_SEP # If starts with ',' or ';', don't print anyting
emit TOK_BYTE emit 63 emit TOK_PUT # Prints a '?' by default
INPUT_VAR_LIST:
INPUT_VAR INPUT_VAR_MORE
INPUT_VAR_MORE:
"," INPUT_VAR_LIST
pass
INPUT_VAR:
VAR_WORD_LVALUE emit TOK_INPUT_STR emit TOK_VAL emit TOK_DPOKE
VAR_BYTE_LVALUE emit TOK_INPUT_STR emit TOK_VAL emit TOK_POKE
VAR_STR_LVALUE emit TOK_INPUT_STR emit TOK_COPY_STR
#@if FASTBASIC_FP
VAR_FP_LVALUE emit TOK_INPUT_STR emit TOK_FP_VAL emit TOK_FP_STORE
#@endif FASTBASIC_FP
# Dim variable types
DIM_VAR_TYPE_NUM: array type
"Byte" emit VT_ARRAY_BYTE
"Word" emit TOK_USHL emit VT_ARRAY_WORD
emit TOK_USHL emit VT_ARRAY_WORD
DIM_VAR_TYPE:
"$" PAR_EXPR emit TOK_USHL emit VT_ARRAY_STRING
PAR_EXPR DIM_VAR_TYPE_NUM
DIM_VAR: new variable name
emit TOK_VAR_ADDR E_VAR_CREATE DIM_VAR_TYPE E_VAR_SET_TYPE emit TOK_DIM
# I/O expressions
IO_CHAN: I/O channel number
"#" emit TOK_BYTE emit IOCHN EXPR emit TOK_USHL emit TOK_USHL emit TOK_USHL emit TOK_USHL emit TOK_POKE
# Note: we need the version without comma for "CLOSE #*"
IO_CHAN_COMMA:
IO_CHAN ","
IO_CHAN_OPT:
IO_CHAN_COMMA
pass
# Get from keyboard expression
GETK_EXPR: variable name
VAR_BYTE_LVALUE emit TOK_GETKEY emit TOK_POKE
VAR_WORD_LVALUE emit TOK_GETKEY emit TOK_DPOKE
# Get expression
GET_EXPR: variable name
VAR_BYTE_LVALUE emit TOK_GET emit TOK_POKE GET_EXPR_MORE
VAR_WORD_LVALUE emit TOK_GET emit TOK_DPOKE GET_EXPR_MORE
GET_EXPR_MORE:
"," GET_EXPR
emit TOK_IOCHN0
# Get two comma separated expressions "A,B" and returns "A*16+B"
EXPR_AB:
EXPR emit TOK_USHL emit TOK_USHL emit TOK_USHL emit TOK_USHL "," EXPR emit TOK_ADD
# 2 expressions separated by comma
EXPR_2:
EXPR "," EXPR
# Parses a XIO AUX1/AUX2/STRING expression
XIO_EXPR:
EXPR_2 emit TOK_SHL8 emit TOK_ADD "," STR_EXPR emit TOK_XIO
# Parses a "DATA" expression, get's binary data in memory
DATA_WORDS: data word
"," E_NUMBER_WORD DATA_WORDS
pass
DATA_BYTES: data byte
# To store bytes, simply remove upper part
"," E_NUMBER_BYTE DATA_BYTES
pass
DATA_TYPE: data type
"Byte" emit VT_ARRAY_BYTE E_VAR_SET_TYPE EQUAL E_NUMBER_BYTE DATA_BYTES
"Word" emit VT_ARRAY_WORD E_VAR_SET_TYPE EQUAL E_NUMBER_WORD DATA_WORDS
DATA_END:
","
E_POP_DATA emit TOK_DPOKE
DATA_VAR: new array name
emit TOK_VAR_ADDR E_VAR_CREATE "()" emit TOK_CDATA emit LT_DATA E_PUSH_LT
pass
# Parse a line
PARSE_LINE_COMMAND:
"." E_REM
"?" IO_CHAN_OPT PRINT_EXPR
"PRint" IO_CHAN_OPT PRINT_EXPR
"INput" INPUT_STR INPUT_VAR_LIST emit TOK_IOCHN0
"GEt" GETK_EXPR
"GEt" IO_CHAN_COMMA GET_EXPR
"PUt" IO_CHAN_OPT EXPR emit TOK_PUT
"CLS" IO_CHAN_OPT emit TOK_BYTE emit CLS emit TOK_PUT
"Poke" EXPR_2 emit TOK_POKE
"Dpoke" EXPR_2 emit TOK_DPOKE
"Move" EXPR_2 "," EXPR emit TOK_MOVE
"-move" EXPR_2 "," EXPR emit TOK_NMOVE
"DO" emit LT_DO_LOOP E_PUSH_LT
"Loop" emit TOK_JUMP E_POP_LOOP
"Repeat" emit LT_REPEAT E_PUSH_LT
"Until" FORCE_BOOL_EXPR emit TOK_CJUMP E_POP_REPEAT
"While" emit LT_WHILE_1 E_PUSH_LT FORCE_BOOL_EXPR emit TOK_CJUMP emit LT_WHILE_2 E_PUSH_LT
"WEnd" emit TOK_JUMP E_POP_WHILE
"If" FORCE_BOOL_EXPR emit TOK_CJUMP emit LT_IF E_PUSH_LT THEN_OR_MULTILINE
"For" VAR_WORD_LVALUE EQUAL EXPR emit TOK_FOR_START "TO" EXPR STEP_OPTIONAL emit TOK_FOR emit TOK_L_NOT emit TOK_CJUMP emit LT_FOR_2 E_PUSH_LT emit LT_FOR_1 E_PUSH_LT
"Next" emit TOK_FOR_NEXT emit TOK_CJUMP NEXT_VARNAME E_POP_FOR emit TOK_FOR_EXIT
"Else" emit TOK_JUMP E_ELSE
"ELIf" emit TOK_JUMP E_ELIF FORCE_BOOL_EXPR emit TOK_CJUMP emit LT_IF E_PUSH_LT
"ENDif" E_POP_IF
"EXit" emit TOK_JUMP E_EXIT_LOOP
"Graphics" emit TOK_BYTE emit IOCHN emit TOK_BYTE emit 96 emit TOK_POKE emit TOK_CLOSE EXPR emit TOK_GRAPHICS
"Color" emit TOK_BYTE emit COLOR EXPR emit TOK_POKE
"FColor" emit TOK_NUM word FILDAT EXPR emit TOK_POKE
"POSition" POSITION
"PLot" POSITION emit TOK_BYTE emit COLOR emit TOK_PEEK emit TOK_PLOT
"DRawto" POSITION emit TOK_BYTE emit DRAWLN emit TOK_DRAWTO
"FIllto" POSITION emit TOK_BYTE emit FILLIN emit TOK_DRAWTO
"SEtcolor" EXPR emit TOK_NUM word COLOR0 emit TOK_ADD "," EXPR_AB emit TOK_POKE
"Sound" SOUND
"DIm" DIM_VAR DIM_MORE
"CLose" IO_CHAN emit TOK_CLOSE
"Open" IO_CHAN_COMMA emit TOK_BYTE emit OPEN XIO_EXPR
"Xio" IO_CHAN_COMMA EXPR "," XIO_EXPR
"BPut" IO_CHAN_COMMA EXPR_2 emit TOK_BPUT
"BGet" IO_CHAN_COMMA EXPR_2 emit TOK_BGET
"PAuse" EXPR emit TOK_PAUSE
"INC" VAR_WORD_LVALUE emit TOK_INC
"DEc" VAR_WORD_LVALUE emit TOK_DEC
"PROc" emit TOK_JUMP emit LT_PROC_1 E_PUSH_LT E_LABEL_DEF emit LT_PROC_2 E_PUSH_LT
"ENDProc" E_POP_PROC_2 emit TOK_RET E_POP_PROC_1
"EXEc" emit TOK_CALL E_LABEL
"DAta" DATA_VAR DATA_TYPE DATA_END
"END" emit TOK_END
#@if FASTBASIC_FP
"DEG" emit TOK_BYTE emit DEGFLAG emit TOK_1 emit TOK_POKE
"RAd" emit TOK_BYTE emit DEGFLAG emit TOK_0 emit TOK_POKE
#@endif FASTBASIC_FP
PARSE_LINE_ASSIGN: &LOW_ERROR
VAR_WORD_LVALUE EQUAL EXPR emit TOK_DPOKE
VAR_BYTE_LVALUE EQUAL EXPR emit TOK_POKE
VAR_STR_LVALUE EQUAL STR_EXPR emit TOK_COPY_STR
VAR_STR_LVALUE EQUAL "+" STR_EXPR emit TOK_CAT_STR
#@if FASTBASIC_FP
VAR_FP_LVALUE EQUAL FP_EXPR emit TOK_FP_STORE
#@endif FASTBASIC_FP
SKIP_COMMENT:
"'" E_REM
E_EOL
pass
PARSE_STATEMENT: statement or variable assignment
PARSE_LINE_COMMAND E_EOL
PARSE_LINE_ASSIGN
pass
PARSE_START:
":" PARSE_START
PARSE_STATEMENT SKIP_COMMENT
# vi:syntax=perl