Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/bc/src/bc_parse.c
39534 views
1
/*
2
* *****************************************************************************
3
*
4
* SPDX-License-Identifier: BSD-2-Clause
5
*
6
* Copyright (c) 2018-2025 Gavin D. Howard and contributors.
7
*
8
* Redistribution and use in source and binary forms, with or without
9
* modification, are permitted provided that the following conditions are met:
10
*
11
* * Redistributions of source code must retain the above copyright notice, this
12
* list of conditions and the following disclaimer.
13
*
14
* * Redistributions in binary form must reproduce the above copyright notice,
15
* this list of conditions and the following disclaimer in the documentation
16
* and/or other materials provided with the distribution.
17
*
18
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28
* POSSIBILITY OF SUCH DAMAGE.
29
*
30
* *****************************************************************************
31
*
32
* The parser for bc.
33
*
34
*/
35
36
#if BC_ENABLED
37
38
#include <assert.h>
39
#include <stdbool.h>
40
#include <stdlib.h>
41
#include <string.h>
42
43
#include <setjmp.h>
44
45
#include <bc.h>
46
#include <num.h>
47
#include <vm.h>
48
49
// Before you embark on trying to understand this code, have you read the
50
// Development manual (manuals/development.md) and the comment in include/bc.h
51
// yet? No? Do that first. I'm serious.
52
//
53
// The reason is because this file holds the most sensitive and finicky code in
54
// the entire codebase. Even getting history to work on Windows was nothing
55
// compared to this. This is where dreams go to die, where dragons live, and
56
// from which Ken Thompson himself would flee.
57
58
static void
59
bc_parse_else(BcParse* p);
60
61
static void
62
bc_parse_stmt(BcParse* p);
63
64
static BcParseStatus
65
bc_parse_expr_err(BcParse* p, uint8_t flags, BcParseNext next);
66
67
static void
68
bc_parse_expr_status(BcParse* p, uint8_t flags, BcParseNext next);
69
70
/**
71
* Returns true if an instruction could only have come from a "leaf" expression.
72
* For more on what leaf expressions are, read the comment for BC_PARSE_LEAF().
73
* @param t The instruction to test.
74
* @return True if the instruction is a from a leaf expression.
75
*/
76
static bool
77
bc_parse_inst_isLeaf(BcInst t)
78
{
79
return (t >= BC_INST_NUM && t <= BC_INST_LEADING_ZERO) ||
80
#if BC_ENABLE_EXTRA_MATH
81
t == BC_INST_TRUNC ||
82
#endif // BC_ENABLE_EXTRA_MATH
83
t <= BC_INST_DEC;
84
}
85
86
/**
87
* Returns true if the *previous* token was a delimiter. A delimiter is anything
88
* that can legally end a statement. In bc's case, it could be a newline, a
89
* semicolon, and a brace in certain cases.
90
* @param p The parser.
91
* @return True if the token is a legal delimiter.
92
*/
93
static bool
94
bc_parse_isDelimiter(const BcParse* p)
95
{
96
BcLexType t = p->l.t;
97
bool good;
98
99
// If it's an obvious delimiter, say so.
100
if (BC_PARSE_DELIMITER(t)) return true;
101
102
good = false;
103
104
// If the current token is a keyword, then...beware. That means that we need
105
// to check for a "dangling" else, where there was no brace-delimited block
106
// on the previous if.
107
if (t == BC_LEX_KW_ELSE)
108
{
109
size_t i;
110
uint16_t *fptr = NULL, flags = BC_PARSE_FLAG_ELSE;
111
112
// As long as going up the stack is valid for a dangling else, keep on.
113
for (i = 0; i < p->flags.len && BC_PARSE_BLOCK_STMT(flags); ++i)
114
{
115
fptr = bc_vec_item_rev(&p->flags, i);
116
flags = *fptr;
117
118
// If we need a brace and don't have one, then we don't have a
119
// delimiter.
120
if ((flags & BC_PARSE_FLAG_BRACE) && p->l.last != BC_LEX_RBRACE)
121
{
122
return false;
123
}
124
}
125
126
// Oh, and we had also better have an if statement somewhere.
127
good = ((flags & BC_PARSE_FLAG_IF) != 0);
128
}
129
else if (t == BC_LEX_RBRACE)
130
{
131
size_t i;
132
133
// Since we have a brace, we need to just check if a brace was needed.
134
for (i = 0; !good && i < p->flags.len; ++i)
135
{
136
uint16_t* fptr = bc_vec_item_rev(&p->flags, i);
137
good = (((*fptr) & BC_PARSE_FLAG_BRACE) != 0);
138
}
139
}
140
141
return good;
142
}
143
144
/**
145
* Returns true if we are in top level of a function body. The POSIX grammar
146
* is defined such that anything is allowed after a function body, so we must
147
* use this function to detect that case when ending a function body.
148
* @param p The parser.
149
* @return True if we are in the top level of parsing a function body.
150
*/
151
static bool
152
bc_parse_TopFunc(const BcParse* p)
153
{
154
bool good = p->flags.len == 2;
155
156
uint16_t val = BC_PARSE_FLAG_BRACE | BC_PARSE_FLAG_FUNC_INNER;
157
val |= BC_PARSE_FLAG_FUNC;
158
159
return good && BC_PARSE_TOP_FLAG(p) == val;
160
}
161
162
/**
163
* Sets a previously defined exit label. What are labels? See the bc Parsing
164
* section of the Development manual (manuals/development.md).
165
* @param p The parser.
166
*/
167
static void
168
bc_parse_setLabel(BcParse* p)
169
{
170
BcFunc* func = p->func;
171
BcInstPtr* ip = bc_vec_top(&p->exits);
172
size_t* label;
173
174
assert(func == bc_vec_item(&p->prog->fns, p->fidx));
175
176
// Set the preallocated label to the correct index.
177
label = bc_vec_item(&func->labels, ip->idx);
178
*label = func->code.len;
179
180
// Now, we don't need the exit label; it is done.
181
bc_vec_pop(&p->exits);
182
}
183
184
/**
185
* Creates a label and sets it to idx. If this is an exit label, then idx is
186
* actually invalid, but it doesn't matter because it will be fixed by
187
* bc_parse_setLabel() later.
188
* @param p The parser.
189
* @param idx The index of the label.
190
*/
191
static void
192
bc_parse_createLabel(BcParse* p, size_t idx)
193
{
194
bc_vec_push(&p->func->labels, &idx);
195
}
196
197
/**
198
* Creates a conditional label. Unlike an exit label, this label is set at
199
* creation time because it comes *before* the code that will target it.
200
* @param p The parser.
201
* @param idx The index of the label.
202
*/
203
static void
204
bc_parse_createCondLabel(BcParse* p, size_t idx)
205
{
206
bc_parse_createLabel(p, p->func->code.len);
207
bc_vec_push(&p->conds, &idx);
208
}
209
210
/**
211
* Creates an exit label to be filled in later by bc_parse_setLabel(). Also, why
212
* create a label to be filled in later? Because exit labels are meant to be
213
* targeted by code that comes *before* the label. Since we have to parse that
214
* code first, and don't know how long it will be, we need to just make sure to
215
* reserve a slot to be filled in later when we know.
216
*
217
* By the way, this uses BcInstPtr because it was convenient. The field idx
218
* holds the index, and the field func holds the loop boolean.
219
*
220
* @param p The parser.
221
* @param idx The index of the label's position.
222
* @param loop True if the exit label is for a loop or not.
223
*/
224
static void
225
bc_parse_createExitLabel(BcParse* p, size_t idx, bool loop)
226
{
227
BcInstPtr ip;
228
229
assert(p->func == bc_vec_item(&p->prog->fns, p->fidx));
230
231
ip.func = loop;
232
ip.idx = idx;
233
ip.len = 0;
234
235
bc_vec_push(&p->exits, &ip);
236
bc_parse_createLabel(p, SIZE_MAX);
237
}
238
239
/**
240
* Pops the correct operators off of the operator stack based on the current
241
* operator. This is because of the Shunting-Yard algorithm. Lower prec means
242
* higher precedence.
243
* @param p The parser.
244
* @param type The operator.
245
* @param start The previous start of the operator stack. For more
246
* information, see the bc Parsing section of the Development
247
* manual (manuals/development.md).
248
* @param nexprs A pointer to the current number of expressions that have not
249
* been consumed yet. This is an IN and OUT parameter.
250
*/
251
static void
252
bc_parse_operator(BcParse* p, BcLexType type, size_t start, size_t* nexprs)
253
{
254
BcLexType t;
255
uchar l, r = BC_PARSE_OP_PREC(type);
256
uchar left = BC_PARSE_OP_LEFT(type);
257
258
// While we haven't hit the stop point yet...
259
while (p->ops.len > start)
260
{
261
// Get the top operator.
262
t = BC_PARSE_TOP_OP(p);
263
264
// If it's a left paren, we have reached the end of whatever expression
265
// this is no matter what. We also don't pop the left paren because it
266
// will need to stay for the rest of the subexpression.
267
if (t == BC_LEX_LPAREN) break;
268
269
// Break for precedence. Precedence operates differently on left and
270
// right associativity, by the way. A left associative operator that
271
// matches the current precedence should take priority, but a right
272
// associative operator should not.
273
//
274
// Also, a lower precedence value means a higher precedence.
275
l = BC_PARSE_OP_PREC(t);
276
if (l >= r && (l != r || !left)) break;
277
278
// Do the housekeeping. In particular, make sure to note that one
279
// expression was consumed (well, two were, but another was added) if
280
// the operator was not a prefix operator. (Postfix operators are not
281
// handled by this function at all.)
282
bc_parse_push(p, BC_PARSE_TOKEN_INST(t));
283
bc_vec_pop(&p->ops);
284
*nexprs -= !BC_PARSE_OP_PREFIX(t);
285
}
286
287
bc_vec_push(&p->ops, &type);
288
}
289
290
/**
291
* Parses a right paren. In the Shunting-Yard algorithm, it needs to be put on
292
* the operator stack. But before that, it needs to consume whatever operators
293
* there are until it hits a left paren.
294
* @param p The parser.
295
* @param nexprs A pointer to the current number of expressions that have not
296
* been consumed yet. This is an IN and OUT parameter.
297
*/
298
static void
299
bc_parse_rightParen(BcParse* p, size_t* nexprs)
300
{
301
BcLexType top;
302
303
// Consume operators until a left paren.
304
while ((top = BC_PARSE_TOP_OP(p)) != BC_LEX_LPAREN)
305
{
306
bc_parse_push(p, BC_PARSE_TOKEN_INST(top));
307
bc_vec_pop(&p->ops);
308
*nexprs -= !BC_PARSE_OP_PREFIX(top);
309
}
310
311
// We need to pop the left paren as well.
312
bc_vec_pop(&p->ops);
313
314
// Oh, and we also want the next token.
315
bc_lex_next(&p->l);
316
}
317
318
/**
319
* Parses function arguments.
320
* @param p The parser.
321
* @param flags Flags restricting what kind of expressions the arguments can
322
* be.
323
*/
324
static void
325
bc_parse_args(BcParse* p, uint8_t flags)
326
{
327
bool comma = false;
328
size_t nargs;
329
330
bc_lex_next(&p->l);
331
332
// Print and comparison operators not allowed. Well, comparison operators
333
// only for POSIX. But we do allow arrays, and we *must* get a value.
334
flags &= ~(BC_PARSE_PRINT | BC_PARSE_REL);
335
flags |= (BC_PARSE_ARRAY | BC_PARSE_NEEDVAL);
336
337
// Count the arguments and parse them.
338
for (nargs = 0; p->l.t != BC_LEX_RPAREN; ++nargs)
339
{
340
bc_parse_expr_status(p, flags, bc_parse_next_arg);
341
342
comma = (p->l.t == BC_LEX_COMMA);
343
if (comma) bc_lex_next(&p->l);
344
}
345
346
// An ending comma is FAIL.
347
if (BC_ERR(comma)) bc_parse_err(p, BC_ERR_PARSE_TOKEN);
348
349
// Now do the call with the number of arguments.
350
bc_parse_push(p, BC_INST_CALL);
351
bc_parse_pushIndex(p, nargs);
352
}
353
354
/**
355
* Parses a function call.
356
* @param p The parser.
357
* @param flags Flags restricting what kind of expressions the arguments can
358
* be.
359
*/
360
static void
361
bc_parse_call(BcParse* p, const char* name, uint8_t flags)
362
{
363
size_t idx;
364
365
bc_parse_args(p, flags);
366
367
// We just assert this because bc_parse_args() should
368
// ensure that the next token is what it should be.
369
assert(p->l.t == BC_LEX_RPAREN);
370
371
// We cannot use bc_program_insertFunc() here
372
// because it will overwrite an existing function.
373
idx = bc_map_index(&p->prog->fn_map, name);
374
375
// The function does not exist yet. Create a space for it. If the user does
376
// not define it, it's a *runtime* error, not a parse error.
377
if (idx == BC_VEC_INVALID_IDX)
378
{
379
idx = bc_program_insertFunc(p->prog, name);
380
381
assert(idx != BC_VEC_INVALID_IDX);
382
383
// Make sure that this pointer was not invalidated.
384
p->func = bc_vec_item(&p->prog->fns, p->fidx);
385
}
386
// The function exists, so set the right function index.
387
else idx = ((BcId*) bc_vec_item(&p->prog->fn_map, idx))->idx;
388
389
bc_parse_pushIndex(p, idx);
390
391
// Make sure to get the next token.
392
bc_lex_next(&p->l);
393
}
394
395
/**
396
* Parses a name/identifier-based expression. It could be a variable, an array
397
* element, an array itself (for function arguments), a function call, etc.
398
* @param p The parser.
399
* @param type A pointer to return the resulting instruction.
400
* @param can_assign A pointer to return true if the name can be assigned to,
401
* false otherwise.
402
* @param flags Flags restricting what kind of expression the name can be.
403
*/
404
static void
405
bc_parse_name(BcParse* p, BcInst* type, bool* can_assign, uint8_t flags)
406
{
407
char* name;
408
409
BC_SIG_ASSERT_LOCKED;
410
411
// We want a copy of the name since the lexer might overwrite its copy.
412
name = bc_vm_strdup(p->l.str.v);
413
414
BC_SETJMP_LOCKED(vm, err);
415
416
// We need the next token to see if it's just a variable or something more.
417
bc_lex_next(&p->l);
418
419
// Array element or array.
420
if (p->l.t == BC_LEX_LBRACKET)
421
{
422
bc_lex_next(&p->l);
423
424
// Array only. This has to be a function parameter.
425
if (p->l.t == BC_LEX_RBRACKET)
426
{
427
// Error if arrays are not allowed.
428
if (BC_ERR(!(flags & BC_PARSE_ARRAY)))
429
{
430
bc_parse_err(p, BC_ERR_PARSE_EXPR);
431
}
432
433
*type = BC_INST_ARRAY;
434
*can_assign = false;
435
}
436
else
437
{
438
// If we are here, we have an array element. We need to set the
439
// expression parsing flags.
440
uint8_t flags2 = (flags & ~(BC_PARSE_PRINT | BC_PARSE_REL)) |
441
BC_PARSE_NEEDVAL;
442
443
bc_parse_expr_status(p, flags2, bc_parse_next_elem);
444
445
// The next token *must* be a right bracket.
446
if (BC_ERR(p->l.t != BC_LEX_RBRACKET))
447
{
448
bc_parse_err(p, BC_ERR_PARSE_TOKEN);
449
}
450
451
*type = BC_INST_ARRAY_ELEM;
452
*can_assign = true;
453
}
454
455
// Make sure to get the next token.
456
bc_lex_next(&p->l);
457
458
// Push the instruction and the name of the identifier.
459
bc_parse_push(p, *type);
460
bc_parse_pushName(p, name, false);
461
}
462
else if (p->l.t == BC_LEX_LPAREN)
463
{
464
// We are parsing a function call; error if not allowed.
465
if (BC_ERR(flags & BC_PARSE_NOCALL))
466
{
467
bc_parse_err(p, BC_ERR_PARSE_TOKEN);
468
}
469
470
*type = BC_INST_CALL;
471
*can_assign = false;
472
473
bc_parse_call(p, name, flags);
474
}
475
else
476
{
477
// Just a variable.
478
*type = BC_INST_VAR;
479
*can_assign = true;
480
bc_parse_push(p, BC_INST_VAR);
481
bc_parse_pushName(p, name, true);
482
}
483
484
err:
485
// Need to make sure to unallocate the name.
486
free(name);
487
BC_LONGJMP_CONT(vm);
488
BC_SIG_MAYLOCK;
489
}
490
491
/**
492
* Parses a builtin function that takes no arguments. This includes read(),
493
* rand(), maxibase(), maxobase(), maxscale(), and maxrand().
494
* @param p The parser.
495
* @param inst The instruction corresponding to the builtin.
496
*/
497
static void
498
bc_parse_noArgBuiltin(BcParse* p, BcInst inst)
499
{
500
// Must have a left paren.
501
bc_lex_next(&p->l);
502
if (BC_ERR(p->l.t != BC_LEX_LPAREN)) bc_parse_err(p, BC_ERR_PARSE_TOKEN);
503
504
// Must have a right paren.
505
bc_lex_next(&p->l);
506
if ((p->l.t != BC_LEX_RPAREN)) bc_parse_err(p, BC_ERR_PARSE_TOKEN);
507
508
bc_parse_push(p, inst);
509
510
bc_lex_next(&p->l);
511
}
512
513
/**
514
* Parses a builtin function that takes 1 argument. This includes length(),
515
* sqrt(), abs(), scale(), and irand().
516
* @param p The parser.
517
* @param type The lex token.
518
* @param flags The expression parsing flags for parsing the argument.
519
* @param prev An out parameter; the previous instruction pointer.
520
*/
521
static void
522
bc_parse_builtin(BcParse* p, BcLexType type, uint8_t flags, BcInst* prev)
523
{
524
// Must have a left paren.
525
bc_lex_next(&p->l);
526
if (BC_ERR(p->l.t != BC_LEX_LPAREN)) bc_parse_err(p, BC_ERR_PARSE_TOKEN);
527
528
bc_lex_next(&p->l);
529
530
// Change the flags as needed for parsing the argument.
531
flags &= ~(BC_PARSE_PRINT | BC_PARSE_REL);
532
flags |= BC_PARSE_NEEDVAL;
533
534
// Since length can take arrays, we need to specially add that flag.
535
if (type == BC_LEX_KW_LENGTH || type == BC_LEX_KW_ASCIIFY)
536
{
537
flags |= BC_PARSE_ARRAY;
538
}
539
540
// Otherwise, we need to clear it because it could be set.
541
else flags &= ~(BC_PARSE_ARRAY);
542
543
bc_parse_expr_status(p, flags, bc_parse_next_rel);
544
545
// Must have a right paren.
546
if (BC_ERR(p->l.t != BC_LEX_RPAREN)) bc_parse_err(p, BC_ERR_PARSE_TOKEN);
547
548
// Adjust previous based on the token and push it.
549
*prev = type - BC_LEX_KW_LENGTH + BC_INST_LENGTH;
550
bc_parse_push(p, *prev);
551
552
bc_lex_next(&p->l);
553
}
554
555
/**
556
* Parses a builtin function that takes 3 arguments. This includes modexp() and
557
* divmod().
558
* @param p The parser.
559
* @param type The lex token.
560
* @param flags The expression parsing flags for parsing the argument.
561
* @param prev An out parameter; the previous instruction pointer.
562
*/
563
static void
564
bc_parse_builtin3(BcParse* p, BcLexType type, uint8_t flags, BcInst* prev)
565
{
566
assert(type == BC_LEX_KW_MODEXP || type == BC_LEX_KW_DIVMOD);
567
568
// Must have a left paren.
569
bc_lex_next(&p->l);
570
if (BC_ERR(p->l.t != BC_LEX_LPAREN)) bc_parse_err(p, BC_ERR_PARSE_TOKEN);
571
572
bc_lex_next(&p->l);
573
574
// Change the flags as needed for parsing the argument.
575
flags &= ~(BC_PARSE_PRINT | BC_PARSE_REL);
576
flags |= BC_PARSE_NEEDVAL;
577
578
bc_parse_expr_status(p, flags, bc_parse_next_builtin);
579
580
// Must have a comma.
581
if (BC_ERR(p->l.t != BC_LEX_COMMA)) bc_parse_err(p, BC_ERR_PARSE_TOKEN);
582
583
bc_lex_next(&p->l);
584
585
bc_parse_expr_status(p, flags, bc_parse_next_builtin);
586
587
// Must have a comma.
588
if (BC_ERR(p->l.t != BC_LEX_COMMA)) bc_parse_err(p, BC_ERR_PARSE_TOKEN);
589
590
bc_lex_next(&p->l);
591
592
// If it is a divmod, parse an array name. Otherwise, just parse another
593
// expression.
594
if (type == BC_LEX_KW_DIVMOD)
595
{
596
// Must have a name.
597
if (BC_ERR(p->l.t != BC_LEX_NAME)) bc_parse_err(p, BC_ERR_PARSE_TOKEN);
598
599
// This is safe because the next token should not overwrite the name.
600
bc_lex_next(&p->l);
601
602
// Must have a left bracket.
603
if (BC_ERR(p->l.t != BC_LEX_LBRACKET))
604
{
605
bc_parse_err(p, BC_ERR_PARSE_TOKEN);
606
}
607
608
// This is safe because the next token should not overwrite the name.
609
bc_lex_next(&p->l);
610
611
// Must have a right bracket.
612
if (BC_ERR(p->l.t != BC_LEX_RBRACKET))
613
{
614
bc_parse_err(p, BC_ERR_PARSE_TOKEN);
615
}
616
617
// This is safe because the next token should not overwrite the name.
618
bc_lex_next(&p->l);
619
}
620
else bc_parse_expr_status(p, flags, bc_parse_next_rel);
621
622
// Must have a right paren.
623
if (BC_ERR(p->l.t != BC_LEX_RPAREN)) bc_parse_err(p, BC_ERR_PARSE_TOKEN);
624
625
// Adjust previous based on the token and push it.
626
*prev = type - BC_LEX_KW_MODEXP + BC_INST_MODEXP;
627
bc_parse_push(p, *prev);
628
629
// If we have divmod, we need to assign the modulus to the array element, so
630
// we need to push the instructions for doing so.
631
if (type == BC_LEX_KW_DIVMOD)
632
{
633
// The zeroth element.
634
bc_parse_push(p, BC_INST_ZERO);
635
bc_parse_push(p, BC_INST_ARRAY_ELEM);
636
637
// Push the array.
638
bc_parse_pushName(p, p->l.str.v, false);
639
640
// Swap them and assign. After this, the top item on the stack should
641
// be the quotient.
642
bc_parse_push(p, BC_INST_SWAP);
643
bc_parse_push(p, BC_INST_ASSIGN_NO_VAL);
644
}
645
646
bc_lex_next(&p->l);
647
}
648
649
/**
650
* Parses the scale keyword. This is special because scale can be a value or a
651
* builtin function.
652
* @param p The parser.
653
* @param type An out parameter; the instruction for the parse.
654
* @param can_assign An out parameter; whether the expression can be assigned
655
* to.
656
* @param flags The expression parsing flags for parsing a scale() arg.
657
*/
658
static void
659
bc_parse_scale(BcParse* p, BcInst* type, bool* can_assign, uint8_t flags)
660
{
661
bc_lex_next(&p->l);
662
663
// Without the left paren, it's just the keyword.
664
if (p->l.t != BC_LEX_LPAREN)
665
{
666
// Set, push, and return.
667
*type = BC_INST_SCALE;
668
*can_assign = true;
669
bc_parse_push(p, BC_INST_SCALE);
670
return;
671
}
672
673
// Handle the scale function.
674
*type = BC_INST_SCALE_FUNC;
675
*can_assign = false;
676
677
// Once again, adjust the flags.
678
flags &= ~(BC_PARSE_PRINT | BC_PARSE_REL);
679
flags |= BC_PARSE_NEEDVAL;
680
681
bc_lex_next(&p->l);
682
683
bc_parse_expr_status(p, flags, bc_parse_next_rel);
684
685
// Must have a right paren.
686
if (BC_ERR(p->l.t != BC_LEX_RPAREN)) bc_parse_err(p, BC_ERR_PARSE_TOKEN);
687
688
bc_parse_push(p, BC_INST_SCALE_FUNC);
689
690
bc_lex_next(&p->l);
691
}
692
693
/**
694
* Parses and increment or decrement operator. This is a bit complex.
695
* @param p The parser.
696
* @param prev An out parameter; the previous instruction pointer.
697
* @param can_assign An out parameter; whether the expression can be assigned
698
* to.
699
* @param nexs An in/out parameter; the number of expressions in the
700
* parse tree that are not used.
701
* @param flags The expression parsing flags for parsing a scale() arg.
702
*/
703
static void
704
bc_parse_incdec(BcParse* p, BcInst* prev, bool* can_assign, size_t* nexs,
705
uint8_t flags)
706
{
707
BcLexType type;
708
uchar inst;
709
BcInst etype = *prev;
710
BcLexType last = p->l.last;
711
712
assert(prev != NULL && can_assign != NULL);
713
714
// If we can't assign to the previous token, then we have an error.
715
if (BC_ERR(last == BC_LEX_OP_INC || last == BC_LEX_OP_DEC ||
716
last == BC_LEX_RPAREN))
717
{
718
bc_parse_err(p, BC_ERR_PARSE_ASSIGN);
719
}
720
721
// Is the previous instruction for a variable?
722
if (BC_PARSE_INST_VAR(etype))
723
{
724
// If so, this is a postfix operator.
725
if (!*can_assign) bc_parse_err(p, BC_ERR_PARSE_ASSIGN);
726
727
// Only postfix uses BC_INST_INC and BC_INST_DEC.
728
*prev = inst = BC_INST_INC + (p->l.t != BC_LEX_OP_INC);
729
bc_parse_push(p, inst);
730
bc_lex_next(&p->l);
731
*can_assign = false;
732
}
733
else
734
{
735
// This is a prefix operator. In that case, we just convert it to
736
// an assignment instruction.
737
*prev = inst = BC_INST_ASSIGN_PLUS + (p->l.t != BC_LEX_OP_INC);
738
739
bc_lex_next(&p->l);
740
type = p->l.t;
741
742
// Because we parse the next part of the expression
743
// right here, we need to increment this.
744
*nexs = *nexs + 1;
745
746
// Is the next token a normal identifier?
747
if (type == BC_LEX_NAME)
748
{
749
// Parse the name.
750
uint8_t flags2 = flags & ~(BC_PARSE_ARRAY);
751
bc_parse_name(p, prev, can_assign, flags2 | BC_PARSE_NOCALL);
752
}
753
// Is the next token a global?
754
else if (type >= BC_LEX_KW_LAST && type <= BC_LEX_KW_OBASE)
755
{
756
bc_parse_push(p, type - BC_LEX_KW_LAST + BC_INST_LAST);
757
bc_lex_next(&p->l);
758
}
759
// Is the next token specifically scale, which needs special treatment?
760
else if (BC_NO_ERR(type == BC_LEX_KW_SCALE))
761
{
762
bc_lex_next(&p->l);
763
764
// Check that scale() was not used.
765
if (BC_ERR(p->l.t == BC_LEX_LPAREN))
766
{
767
bc_parse_err(p, BC_ERR_PARSE_TOKEN);
768
}
769
else bc_parse_push(p, BC_INST_SCALE);
770
}
771
// Now we know we have an error.
772
else bc_parse_err(p, BC_ERR_PARSE_TOKEN);
773
774
*can_assign = false;
775
776
bc_parse_push(p, BC_INST_ONE);
777
bc_parse_push(p, inst);
778
}
779
}
780
781
/**
782
* Parses the minus operator. This needs special treatment because it is either
783
* subtract or negation.
784
* @param p The parser.
785
* @param prev An in/out parameter; the previous instruction.
786
* @param ops_bgn The size of the operator stack.
787
* @param rparen True if the last token was a right paren.
788
* @param binlast True if the last token was a binary operator.
789
* @param nexprs An in/out parameter; the number of unused expressions.
790
*/
791
static void
792
bc_parse_minus(BcParse* p, BcInst* prev, size_t ops_bgn, bool rparen,
793
bool binlast, size_t* nexprs)
794
{
795
BcLexType type;
796
797
bc_lex_next(&p->l);
798
799
// Figure out if it's a minus or a negation.
800
type = BC_PARSE_LEAF(*prev, binlast, rparen) ? BC_LEX_OP_MINUS : BC_LEX_NEG;
801
*prev = BC_PARSE_TOKEN_INST(type);
802
803
// We can just push onto the op stack because this is the largest
804
// precedence operator that gets pushed. Inc/dec does not.
805
if (type != BC_LEX_OP_MINUS) bc_vec_push(&p->ops, &type);
806
else bc_parse_operator(p, type, ops_bgn, nexprs);
807
}
808
809
/**
810
* Parses a string.
811
* @param p The parser.
812
* @param inst The instruction corresponding to how the string was found and
813
* how it should be printed.
814
*/
815
static void
816
bc_parse_str(BcParse* p, BcInst inst)
817
{
818
bc_parse_addString(p);
819
bc_parse_push(p, inst);
820
bc_lex_next(&p->l);
821
}
822
823
/**
824
* Parses a print statement.
825
* @param p The parser.
826
*/
827
static void
828
bc_parse_print(BcParse* p, BcLexType type)
829
{
830
BcLexType t;
831
bool comma = false;
832
BcInst inst = type == BC_LEX_KW_STREAM ? BC_INST_PRINT_STREAM :
833
BC_INST_PRINT_POP;
834
835
bc_lex_next(&p->l);
836
837
t = p->l.t;
838
839
// A print or stream statement has to have *something*.
840
if (bc_parse_isDelimiter(p)) bc_parse_err(p, BC_ERR_PARSE_PRINT);
841
842
do
843
{
844
// If the token is a string, then print it with escapes.
845
// BC_INST_PRINT_POP plays that role for bc.
846
if (t == BC_LEX_STR) bc_parse_str(p, inst);
847
else
848
{
849
// We have an actual number; parse and add a print instruction.
850
bc_parse_expr_status(p, BC_PARSE_NEEDVAL, bc_parse_next_print);
851
bc_parse_push(p, inst);
852
}
853
854
// Is the next token a comma?
855
comma = (p->l.t == BC_LEX_COMMA);
856
857
// Get the next token if we have a comma.
858
if (comma) bc_lex_next(&p->l);
859
else
860
{
861
// If we don't have a comma, the statement needs to end.
862
if (!bc_parse_isDelimiter(p)) bc_parse_err(p, BC_ERR_PARSE_TOKEN);
863
else break;
864
}
865
866
t = p->l.t;
867
}
868
while (true);
869
870
// If we have a comma but no token, that's bad.
871
if (BC_ERR(comma)) bc_parse_err(p, BC_ERR_PARSE_TOKEN);
872
}
873
874
/**
875
* Parses a return statement.
876
* @param p The parser.
877
*/
878
static void
879
bc_parse_return(BcParse* p)
880
{
881
BcLexType t;
882
bool paren;
883
uchar inst = BC_INST_RET0;
884
885
// If we are not in a function, that's an error.
886
if (BC_ERR(!BC_PARSE_FUNC(p))) bc_parse_err(p, BC_ERR_PARSE_TOKEN);
887
888
// If we are in a void function, make sure to return void.
889
if (p->func->voidfn) inst = BC_INST_RET_VOID;
890
891
bc_lex_next(&p->l);
892
893
t = p->l.t;
894
paren = (t == BC_LEX_LPAREN);
895
896
// An empty return statement just needs to push the selected instruction.
897
if (bc_parse_isDelimiter(p)) bc_parse_push(p, inst);
898
else
899
{
900
BcParseStatus s;
901
902
// Need to parse the expression whose value will be returned.
903
s = bc_parse_expr_err(p, BC_PARSE_NEEDVAL, bc_parse_next_expr);
904
905
// If the expression was empty, just push the selected instruction.
906
if (s == BC_PARSE_STATUS_EMPTY_EXPR)
907
{
908
bc_parse_push(p, inst);
909
bc_lex_next(&p->l);
910
}
911
912
// POSIX requires parentheses.
913
if (!paren || p->l.last != BC_LEX_RPAREN)
914
{
915
bc_parse_err(p, BC_ERR_POSIX_RET);
916
}
917
918
// Void functions require an empty expression.
919
if (BC_ERR(p->func->voidfn))
920
{
921
if (s != BC_PARSE_STATUS_EMPTY_EXPR)
922
{
923
bc_parse_verr(p, BC_ERR_PARSE_RET_VOID, p->func->name);
924
}
925
}
926
// If we got here, we want to be sure to end the function with a real
927
// return instruction, just in case.
928
else bc_parse_push(p, BC_INST_RET);
929
}
930
}
931
932
/**
933
* Clears flags that indicate the end of an if statement and its block and sets
934
* the jump location.
935
* @param p The parser.
936
*/
937
static void
938
bc_parse_noElse(BcParse* p)
939
{
940
uint16_t* flag_ptr = BC_PARSE_TOP_FLAG_PTR(p);
941
*flag_ptr = (*flag_ptr & ~(BC_PARSE_FLAG_IF_END));
942
bc_parse_setLabel(p);
943
}
944
945
/**
946
* Ends (finishes parsing) the body of a control statement or a function.
947
* @param p The parser.
948
* @param brace True if the body was ended by a brace, false otherwise.
949
*/
950
static void
951
bc_parse_endBody(BcParse* p, bool brace)
952
{
953
bool has_brace, new_else = false;
954
955
// We cannot be ending a body if there are no bodies to end.
956
if (BC_ERR(p->flags.len <= 1)) bc_parse_err(p, BC_ERR_PARSE_TOKEN);
957
958
if (brace)
959
{
960
// The brace was already gotten; make sure that the caller did not lie.
961
// We check for the requirement of braces later.
962
assert(p->l.t == BC_LEX_RBRACE);
963
964
bc_lex_next(&p->l);
965
966
// If the next token is not a delimiter, that is a problem.
967
if (BC_ERR(!bc_parse_isDelimiter(p) && !bc_parse_TopFunc(p)))
968
{
969
bc_parse_err(p, BC_ERR_PARSE_TOKEN);
970
}
971
}
972
973
// Do we have a brace flag?
974
has_brace = (BC_PARSE_BRACE(p) != 0);
975
976
do
977
{
978
size_t len = p->flags.len;
979
bool loop;
980
981
// If we have a brace flag but not a brace, that's a problem.
982
if (has_brace && !brace) bc_parse_err(p, BC_ERR_PARSE_TOKEN);
983
984
// Are we inside a loop?
985
loop = (BC_PARSE_LOOP_INNER(p) != 0);
986
987
// If we are ending a loop or an else...
988
if (loop || BC_PARSE_ELSE(p))
989
{
990
// Loops have condition labels that we have to take care of as well.
991
if (loop)
992
{
993
size_t* label = bc_vec_top(&p->conds);
994
995
bc_parse_push(p, BC_INST_JUMP);
996
bc_parse_pushIndex(p, *label);
997
998
bc_vec_pop(&p->conds);
999
}
1000
1001
bc_parse_setLabel(p);
1002
bc_vec_pop(&p->flags);
1003
}
1004
// If we are ending a function...
1005
else if (BC_PARSE_FUNC_INNER(p))
1006
{
1007
BcInst inst = (p->func->voidfn ? BC_INST_RET_VOID : BC_INST_RET0);
1008
bc_parse_push(p, inst);
1009
bc_parse_updateFunc(p, BC_PROG_MAIN);
1010
bc_vec_pop(&p->flags);
1011
}
1012
// If we have a brace flag and not an if statement, we can pop the top
1013
// of the flags stack because they have been taken care of above.
1014
else if (has_brace && !BC_PARSE_IF(p)) bc_vec_pop(&p->flags);
1015
1016
// This needs to be last to parse nested if's properly.
1017
if (BC_PARSE_IF(p) && (len == p->flags.len || !BC_PARSE_BRACE(p)))
1018
{
1019
// Eat newlines.
1020
while (p->l.t == BC_LEX_NLINE)
1021
{
1022
bc_lex_next(&p->l);
1023
}
1024
1025
// *Now* we can pop the flags.
1026
bc_vec_pop(&p->flags);
1027
1028
// If we are allowed non-POSIX stuff...
1029
if (!BC_S)
1030
{
1031
// Have we found yet another dangling else?
1032
*(BC_PARSE_TOP_FLAG_PTR(p)) |= BC_PARSE_FLAG_IF_END;
1033
new_else = (p->l.t == BC_LEX_KW_ELSE);
1034
1035
// Parse the else or end the if statement body.
1036
if (new_else) bc_parse_else(p);
1037
else if (!has_brace && (!BC_PARSE_IF_END(p) || brace))
1038
{
1039
bc_parse_noElse(p);
1040
}
1041
}
1042
// POSIX requires us to do the bare minimum only.
1043
else bc_parse_noElse(p);
1044
}
1045
1046
// If these are both true, we have "used" the braces that we found.
1047
if (brace && has_brace) brace = false;
1048
}
1049
// This condition was perhaps the hardest single part of the parser. If
1050
// the flags stack does not have enough, we should stop. If we have a
1051
// new else statement, we should stop. If we do have the end of an if
1052
// statement and we have eaten the brace, we should stop. If we do have
1053
// a brace flag, we should stop.
1054
while (p->flags.len > 1 && !new_else && (!BC_PARSE_IF_END(p) || brace) &&
1055
!(has_brace = (BC_PARSE_BRACE(p) != 0)));
1056
1057
// If we have a brace, yet no body for it, that's a problem.
1058
if (BC_ERR(p->flags.len == 1 && brace)) bc_parse_err(p, BC_ERR_PARSE_TOKEN);
1059
else if (brace && BC_PARSE_BRACE(p))
1060
{
1061
// If we make it here, we have a brace and a flag for it.
1062
uint16_t flags = BC_PARSE_TOP_FLAG(p);
1063
1064
// This condition ensure that the *last* body is correctly finished by
1065
// popping its flags.
1066
if (!(flags & (BC_PARSE_FLAG_FUNC_INNER | BC_PARSE_FLAG_LOOP_INNER)) &&
1067
!(flags & (BC_PARSE_FLAG_IF | BC_PARSE_FLAG_ELSE)) &&
1068
!(flags & (BC_PARSE_FLAG_IF_END)))
1069
{
1070
bc_vec_pop(&p->flags);
1071
}
1072
}
1073
}
1074
1075
/**
1076
* Starts the body of a control statement or function.
1077
* @param p The parser.
1078
* @param flags The current flags (will be edited).
1079
*/
1080
static void
1081
bc_parse_startBody(BcParse* p, uint16_t flags)
1082
{
1083
assert(flags);
1084
flags |= (BC_PARSE_TOP_FLAG(p) & (BC_PARSE_FLAG_FUNC | BC_PARSE_FLAG_LOOP));
1085
flags |= BC_PARSE_FLAG_BODY;
1086
bc_vec_push(&p->flags, &flags);
1087
}
1088
1089
void
1090
bc_parse_endif(BcParse* p)
1091
{
1092
size_t i;
1093
bool good;
1094
1095
// Not a problem if this is true.
1096
if (BC_NO_ERR(!BC_PARSE_NO_EXEC(p))) return;
1097
1098
good = true;
1099
1100
// Find an instance of a body that needs closing, i.e., a statement that did
1101
// not have a right brace when it should have.
1102
for (i = 0; good && i < p->flags.len; ++i)
1103
{
1104
uint16_t flag = *((uint16_t*) bc_vec_item(&p->flags, i));
1105
good = ((flag & BC_PARSE_FLAG_BRACE) != BC_PARSE_FLAG_BRACE);
1106
}
1107
1108
// If we did not find such an instance...
1109
if (good)
1110
{
1111
// We set this to restore it later. We don't want the parser thinking
1112
// that we are on stdin for this one because it will want more.
1113
BcMode mode = vm->mode;
1114
1115
vm->mode = BC_MODE_FILE;
1116
1117
// End all of the if statements and loops.
1118
while (p->flags.len > 1 || BC_PARSE_IF_END(p))
1119
{
1120
if (BC_PARSE_IF_END(p)) bc_parse_noElse(p);
1121
if (p->flags.len > 1) bc_parse_endBody(p, false);
1122
}
1123
1124
vm->mode = (uchar) mode;
1125
}
1126
// If we reach here, a block was not properly closed, and we should error.
1127
else bc_parse_err(&vm->prs, BC_ERR_PARSE_BLOCK);
1128
}
1129
1130
/**
1131
* Parses an if statement.
1132
* @param p The parser.
1133
*/
1134
static void
1135
bc_parse_if(BcParse* p)
1136
{
1137
// We are allowed relational operators, and we must have a value.
1138
size_t idx;
1139
uint8_t flags = (BC_PARSE_REL | BC_PARSE_NEEDVAL);
1140
1141
// Get the left paren and barf if necessary.
1142
bc_lex_next(&p->l);
1143
if (BC_ERR(p->l.t != BC_LEX_LPAREN)) bc_parse_err(p, BC_ERR_PARSE_TOKEN);
1144
1145
// Parse the condition.
1146
bc_lex_next(&p->l);
1147
bc_parse_expr_status(p, flags, bc_parse_next_rel);
1148
1149
// Must have a right paren.
1150
if (BC_ERR(p->l.t != BC_LEX_RPAREN)) bc_parse_err(p, BC_ERR_PARSE_TOKEN);
1151
1152
bc_lex_next(&p->l);
1153
1154
// Insert the conditional jump instruction.
1155
bc_parse_push(p, BC_INST_JUMP_ZERO);
1156
1157
idx = p->func->labels.len;
1158
1159
// Push the index for the instruction and create an exit label for an else
1160
// statement.
1161
bc_parse_pushIndex(p, idx);
1162
bc_parse_createExitLabel(p, idx, false);
1163
1164
bc_parse_startBody(p, BC_PARSE_FLAG_IF);
1165
}
1166
1167
/**
1168
* Parses an else statement.
1169
* @param p The parser.
1170
*/
1171
static void
1172
bc_parse_else(BcParse* p)
1173
{
1174
size_t idx = p->func->labels.len;
1175
1176
// We must be at the end of an if statement.
1177
if (BC_ERR(!BC_PARSE_IF_END(p))) bc_parse_err(p, BC_ERR_PARSE_TOKEN);
1178
1179
// Push an unconditional jump to make bc jump over the else statement if it
1180
// executed the original if statement.
1181
bc_parse_push(p, BC_INST_JUMP);
1182
bc_parse_pushIndex(p, idx);
1183
1184
// Clear the else stuff. Yes, that function is misnamed for its use here,
1185
// but deal with it.
1186
bc_parse_noElse(p);
1187
1188
// Create the exit label and parse the body.
1189
bc_parse_createExitLabel(p, idx, false);
1190
bc_parse_startBody(p, BC_PARSE_FLAG_ELSE);
1191
1192
bc_lex_next(&p->l);
1193
}
1194
1195
/**
1196
* Parse a while loop.
1197
* @param p The parser.
1198
*/
1199
static void
1200
bc_parse_while(BcParse* p)
1201
{
1202
// We are allowed relational operators, and we must have a value.
1203
size_t idx;
1204
uint8_t flags = (BC_PARSE_REL | BC_PARSE_NEEDVAL);
1205
1206
// Get the left paren and barf if necessary.
1207
bc_lex_next(&p->l);
1208
if (BC_ERR(p->l.t != BC_LEX_LPAREN)) bc_parse_err(p, BC_ERR_PARSE_TOKEN);
1209
bc_lex_next(&p->l);
1210
1211
// Create the labels. Loops need both.
1212
bc_parse_createCondLabel(p, p->func->labels.len);
1213
idx = p->func->labels.len;
1214
bc_parse_createExitLabel(p, idx, true);
1215
1216
// Parse the actual condition and barf on non-right paren.
1217
bc_parse_expr_status(p, flags, bc_parse_next_rel);
1218
if (BC_ERR(p->l.t != BC_LEX_RPAREN)) bc_parse_err(p, BC_ERR_PARSE_TOKEN);
1219
bc_lex_next(&p->l);
1220
1221
// Now we can push the conditional jump and start the body.
1222
bc_parse_push(p, BC_INST_JUMP_ZERO);
1223
bc_parse_pushIndex(p, idx);
1224
bc_parse_startBody(p, BC_PARSE_FLAG_LOOP | BC_PARSE_FLAG_LOOP_INNER);
1225
}
1226
1227
/**
1228
* Parse a for loop.
1229
* @param p The parser.
1230
*/
1231
static void
1232
bc_parse_for(BcParse* p)
1233
{
1234
size_t cond_idx, exit_idx, body_idx, update_idx;
1235
1236
// Barf on the missing left paren.
1237
bc_lex_next(&p->l);
1238
if (BC_ERR(p->l.t != BC_LEX_LPAREN)) bc_parse_err(p, BC_ERR_PARSE_TOKEN);
1239
bc_lex_next(&p->l);
1240
1241
// The first statement can be empty, but if it is, check for error in POSIX
1242
// mode. Otherwise, parse it.
1243
if (p->l.t != BC_LEX_SCOLON) bc_parse_expr_status(p, 0, bc_parse_next_for);
1244
else bc_parse_err(p, BC_ERR_POSIX_FOR);
1245
1246
// Must have a semicolon.
1247
if (BC_ERR(p->l.t != BC_LEX_SCOLON)) bc_parse_err(p, BC_ERR_PARSE_TOKEN);
1248
bc_lex_next(&p->l);
1249
1250
// These are indices for labels. There are so many of them because the end
1251
// of the loop must unconditionally jump to the update code. Then the update
1252
// code must unconditionally jump to the condition code. Then the condition
1253
// code must *conditionally* jump to the exit.
1254
cond_idx = p->func->labels.len;
1255
update_idx = cond_idx + 1;
1256
body_idx = update_idx + 1;
1257
exit_idx = body_idx + 1;
1258
1259
// This creates the condition label.
1260
bc_parse_createLabel(p, p->func->code.len);
1261
1262
// Parse an expression if it exists.
1263
if (p->l.t != BC_LEX_SCOLON)
1264
{
1265
uint8_t flags = (BC_PARSE_REL | BC_PARSE_NEEDVAL);
1266
bc_parse_expr_status(p, flags, bc_parse_next_for);
1267
}
1268
else
1269
{
1270
// Set this for the next call to bc_parse_number because an empty
1271
// condition means that it is an infinite loop, so the condition must be
1272
// non-zero. This is safe to set because the current token is a
1273
// semicolon, which has no string requirement.
1274
bc_vec_string(&p->l.str, sizeof(bc_parse_one) - 1, bc_parse_one);
1275
bc_parse_number(p);
1276
1277
// An empty condition makes POSIX mad.
1278
bc_parse_err(p, BC_ERR_POSIX_FOR);
1279
}
1280
1281
// Must have a semicolon.
1282
if (BC_ERR(p->l.t != BC_LEX_SCOLON)) bc_parse_err(p, BC_ERR_PARSE_TOKEN);
1283
bc_lex_next(&p->l);
1284
1285
// Now we can set up the conditional jump to the exit and an unconditional
1286
// jump to the body right after. The unconditional jump to the body is
1287
// because there is update code coming right after the condition, so we need
1288
// to skip it to get to the body.
1289
bc_parse_push(p, BC_INST_JUMP_ZERO);
1290
bc_parse_pushIndex(p, exit_idx);
1291
bc_parse_push(p, BC_INST_JUMP);
1292
bc_parse_pushIndex(p, body_idx);
1293
1294
// Now create the label for the update code.
1295
bc_parse_createCondLabel(p, update_idx);
1296
1297
// Parse if not empty, and if it is, let POSIX yell if necessary.
1298
if (p->l.t != BC_LEX_RPAREN) bc_parse_expr_status(p, 0, bc_parse_next_rel);
1299
else bc_parse_err(p, BC_ERR_POSIX_FOR);
1300
1301
// Must have a right paren.
1302
if (BC_ERR(p->l.t != BC_LEX_RPAREN)) bc_parse_err(p, BC_ERR_PARSE_TOKEN);
1303
1304
// Set up a jump to the condition right after the update code.
1305
bc_parse_push(p, BC_INST_JUMP);
1306
bc_parse_pushIndex(p, cond_idx);
1307
bc_parse_createLabel(p, p->func->code.len);
1308
1309
// Create an exit label for the body and start the body.
1310
bc_parse_createExitLabel(p, exit_idx, true);
1311
bc_lex_next(&p->l);
1312
bc_parse_startBody(p, BC_PARSE_FLAG_LOOP | BC_PARSE_FLAG_LOOP_INNER);
1313
}
1314
1315
/**
1316
* Parse a statement or token that indicates a loop exit. This includes an
1317
* actual loop exit, the break keyword, or the continue keyword.
1318
* @param p The parser.
1319
* @param type The type of exit.
1320
*/
1321
static void
1322
bc_parse_loopExit(BcParse* p, BcLexType type)
1323
{
1324
size_t i;
1325
BcInstPtr* ip;
1326
1327
// Must have a loop. If we don't, that's an error.
1328
if (BC_ERR(!BC_PARSE_LOOP(p))) bc_parse_err(p, BC_ERR_PARSE_TOKEN);
1329
1330
// If we have a break statement...
1331
if (type == BC_LEX_KW_BREAK)
1332
{
1333
// If there are no exits, something went wrong somewhere.
1334
if (BC_ERR(!p->exits.len)) bc_parse_err(p, BC_ERR_PARSE_TOKEN);
1335
1336
// Get the exit.
1337
i = p->exits.len - 1;
1338
ip = bc_vec_item(&p->exits, i);
1339
1340
// The condition !ip->func is true if the exit is not for a loop, so we
1341
// need to find the first actual loop exit.
1342
while (!ip->func && i < p->exits.len)
1343
{
1344
ip = bc_vec_item(&p->exits, i);
1345
i -= 1;
1346
}
1347
1348
// Make sure everything is hunky dory.
1349
assert(ip != NULL && (i < p->exits.len || ip->func));
1350
1351
// Set the index for the exit.
1352
i = ip->idx;
1353
}
1354
// If we have a continue statement or just the loop end, jump to the
1355
// condition (or update for a foor loop).
1356
else i = *((size_t*) bc_vec_top(&p->conds));
1357
1358
// Add the unconditional jump.
1359
bc_parse_push(p, BC_INST_JUMP);
1360
bc_parse_pushIndex(p, i);
1361
1362
bc_lex_next(&p->l);
1363
}
1364
1365
/**
1366
* Parse a function (header).
1367
* @param p The parser.
1368
*/
1369
static void
1370
bc_parse_func(BcParse* p)
1371
{
1372
bool comma = false, voidfn;
1373
uint16_t flags;
1374
size_t idx;
1375
1376
bc_lex_next(&p->l);
1377
1378
// Must have a name.
1379
if (BC_ERR(p->l.t != BC_LEX_NAME)) bc_parse_err(p, BC_ERR_PARSE_FUNC);
1380
1381
// If the name is "void", and POSIX is not on, mark as void.
1382
voidfn = (!BC_IS_POSIX && p->l.t == BC_LEX_NAME &&
1383
!strcmp(p->l.str.v, "void"));
1384
1385
// We can safely do this because the expected token should not overwrite the
1386
// function name.
1387
bc_lex_next(&p->l);
1388
1389
// If we *don't* have another name, then void is the name of the function.
1390
voidfn = (voidfn && p->l.t == BC_LEX_NAME);
1391
1392
// With a void function, allow POSIX to complain and get a new token.
1393
if (voidfn)
1394
{
1395
bc_parse_err(p, BC_ERR_POSIX_VOID);
1396
1397
// We can safely do this because the expected token should not overwrite
1398
// the function name.
1399
bc_lex_next(&p->l);
1400
}
1401
1402
// Must have a left paren.
1403
if (BC_ERR(p->l.t != BC_LEX_LPAREN)) bc_parse_err(p, BC_ERR_PARSE_FUNC);
1404
1405
// Make sure the functions map and vector are synchronized.
1406
assert(p->prog->fns.len == p->prog->fn_map.len);
1407
1408
// Insert the function by name into the map and vector.
1409
idx = bc_program_insertFunc(p->prog, p->l.str.v);
1410
1411
// Make sure the insert worked.
1412
assert(idx);
1413
1414
// Update the function pointer and stuff in the parser and set its void.
1415
bc_parse_updateFunc(p, idx);
1416
p->func->voidfn = voidfn;
1417
1418
bc_lex_next(&p->l);
1419
1420
// While we do not have a right paren, we are still parsing arguments.
1421
while (p->l.t != BC_LEX_RPAREN)
1422
{
1423
BcType t = BC_TYPE_VAR;
1424
1425
// If we have an asterisk, we are parsing a reference argument.
1426
if (p->l.t == BC_LEX_OP_MULTIPLY)
1427
{
1428
t = BC_TYPE_REF;
1429
bc_lex_next(&p->l);
1430
1431
// Let POSIX complain if necessary.
1432
bc_parse_err(p, BC_ERR_POSIX_REF);
1433
}
1434
1435
// If we don't have a name, the argument will not have a name. Barf.
1436
if (BC_ERR(p->l.t != BC_LEX_NAME)) bc_parse_err(p, BC_ERR_PARSE_FUNC);
1437
1438
// Increment the number of parameters.
1439
p->func->nparams += 1;
1440
1441
// Copy the string in the lexer so that we can use the lexer again.
1442
bc_vec_string(&p->buf, p->l.str.len, p->l.str.v);
1443
1444
bc_lex_next(&p->l);
1445
1446
// We are parsing an array parameter if this is true.
1447
if (p->l.t == BC_LEX_LBRACKET)
1448
{
1449
// Set the array type, unless we are already parsing a reference.
1450
if (t == BC_TYPE_VAR) t = BC_TYPE_ARRAY;
1451
1452
bc_lex_next(&p->l);
1453
1454
// The brackets *must* be empty.
1455
if (BC_ERR(p->l.t != BC_LEX_RBRACKET))
1456
{
1457
bc_parse_err(p, BC_ERR_PARSE_FUNC);
1458
}
1459
1460
bc_lex_next(&p->l);
1461
}
1462
// If we did *not* get a bracket, but we are expecting a reference, we
1463
// have a problem.
1464
else if (BC_ERR(t == BC_TYPE_REF))
1465
{
1466
bc_parse_verr(p, BC_ERR_PARSE_REF_VAR, p->buf.v);
1467
}
1468
1469
// Test for comma and get the next token if it exists.
1470
comma = (p->l.t == BC_LEX_COMMA);
1471
if (comma) bc_lex_next(&p->l);
1472
1473
// Insert the parameter into the function.
1474
bc_func_insert(p->func, p->prog, p->buf.v, t, p->l.line);
1475
}
1476
1477
// If we have a comma, but no parameter, barf.
1478
if (BC_ERR(comma)) bc_parse_err(p, BC_ERR_PARSE_FUNC);
1479
1480
// Start the body.
1481
flags = BC_PARSE_FLAG_FUNC | BC_PARSE_FLAG_FUNC_INNER;
1482
bc_parse_startBody(p, flags);
1483
1484
bc_lex_next(&p->l);
1485
1486
// POSIX requires that a brace be on the same line as the function header.
1487
// If we don't have a brace, let POSIX throw an error.
1488
if (p->l.t != BC_LEX_LBRACE) bc_parse_err(p, BC_ERR_POSIX_BRACE);
1489
}
1490
1491
/**
1492
* Parse an auto list.
1493
* @param p The parser.
1494
*/
1495
static void
1496
bc_parse_auto(BcParse* p)
1497
{
1498
bool comma, one;
1499
1500
// Error if the auto keyword appeared in the wrong place.
1501
if (BC_ERR(!p->auto_part)) bc_parse_err(p, BC_ERR_PARSE_TOKEN);
1502
bc_lex_next(&p->l);
1503
1504
p->auto_part = comma = false;
1505
1506
// We need at least one variable or array.
1507
one = (p->l.t == BC_LEX_NAME);
1508
1509
// While we have a variable or array.
1510
while (p->l.t == BC_LEX_NAME)
1511
{
1512
BcType t;
1513
1514
// Copy the name from the lexer, so we can use it again.
1515
bc_vec_string(&p->buf, p->l.str.len - 1, p->l.str.v);
1516
1517
bc_lex_next(&p->l);
1518
1519
// If we are parsing an array...
1520
if (p->l.t == BC_LEX_LBRACKET)
1521
{
1522
t = BC_TYPE_ARRAY;
1523
1524
bc_lex_next(&p->l);
1525
1526
// The brackets *must* be empty.
1527
if (BC_ERR(p->l.t != BC_LEX_RBRACKET))
1528
{
1529
bc_parse_err(p, BC_ERR_PARSE_FUNC);
1530
}
1531
1532
bc_lex_next(&p->l);
1533
}
1534
else t = BC_TYPE_VAR;
1535
1536
// Test for comma and get the next token if it exists.
1537
comma = (p->l.t == BC_LEX_COMMA);
1538
if (comma) bc_lex_next(&p->l);
1539
1540
// Insert the auto into the function.
1541
bc_func_insert(p->func, p->prog, p->buf.v, t, p->l.line);
1542
}
1543
1544
// If we have a comma, but no auto, barf.
1545
if (BC_ERR(comma)) bc_parse_err(p, BC_ERR_PARSE_FUNC);
1546
1547
// If we don't have any variables or arrays, barf.
1548
if (BC_ERR(!one)) bc_parse_err(p, BC_ERR_PARSE_NO_AUTO);
1549
1550
// The auto statement should be all that's in the statement.
1551
if (BC_ERR(!bc_parse_isDelimiter(p))) bc_parse_err(p, BC_ERR_PARSE_TOKEN);
1552
}
1553
1554
/**
1555
* Parses a body.
1556
* @param p The parser.
1557
* @param brace True if a brace was encountered, false otherwise.
1558
*/
1559
static void
1560
bc_parse_body(BcParse* p, bool brace)
1561
{
1562
uint16_t* flag_ptr = BC_PARSE_TOP_FLAG_PTR(p);
1563
1564
assert(flag_ptr != NULL);
1565
assert(p->flags.len >= 2);
1566
1567
// The body flag is for when we expect a body. We got a body, so clear the
1568
// flag.
1569
*flag_ptr &= ~(BC_PARSE_FLAG_BODY);
1570
1571
// If we are inside a function, that means we just barely entered it, and
1572
// we can expect an auto list.
1573
if (*flag_ptr & BC_PARSE_FLAG_FUNC_INNER)
1574
{
1575
// We *must* have a brace in this case.
1576
if (BC_ERR(!brace)) bc_parse_err(p, BC_ERR_PARSE_TOKEN);
1577
1578
p->auto_part = (p->l.t != BC_LEX_KW_AUTO);
1579
1580
if (!p->auto_part)
1581
{
1582
// Make sure this is true to not get a parse error.
1583
p->auto_part = true;
1584
1585
// Since we already have the auto keyword, parse.
1586
bc_parse_auto(p);
1587
}
1588
1589
// Eat a newline.
1590
if (p->l.t == BC_LEX_NLINE) bc_lex_next(&p->l);
1591
}
1592
else
1593
{
1594
// This is the easy part.
1595
size_t len = p->flags.len;
1596
1597
assert(*flag_ptr);
1598
1599
// Parse a statement.
1600
bc_parse_stmt(p);
1601
1602
// This is a very important condition to get right. If there is no
1603
// brace, and no body flag, and the flags len hasn't shrunk, then we
1604
// have a body that was not delimited by braces, so we need to end it
1605
// now, after just one statement.
1606
if (!brace && !BC_PARSE_BODY(p) && len <= p->flags.len)
1607
{
1608
bc_parse_endBody(p, false);
1609
}
1610
}
1611
}
1612
1613
/**
1614
* Parses a statement. This is the entry point for just about everything, except
1615
* function definitions.
1616
* @param p The parser.
1617
*/
1618
static void
1619
bc_parse_stmt(BcParse* p)
1620
{
1621
size_t len;
1622
uint16_t flags;
1623
BcLexType type = p->l.t;
1624
1625
// Eat newline.
1626
if (type == BC_LEX_NLINE)
1627
{
1628
bc_lex_next(&p->l);
1629
return;
1630
}
1631
1632
// Eat auto list.
1633
if (type == BC_LEX_KW_AUTO)
1634
{
1635
bc_parse_auto(p);
1636
return;
1637
}
1638
1639
// If we reach this point, no auto list is allowed.
1640
p->auto_part = false;
1641
1642
// Everything but an else needs to be taken care of here, but else is
1643
// special.
1644
if (type != BC_LEX_KW_ELSE)
1645
{
1646
// After an if, no else found.
1647
if (BC_PARSE_IF_END(p))
1648
{
1649
// Clear the expectation for else, end body, and return. Returning
1650
// gives us a clean slate for parsing again.
1651
bc_parse_noElse(p);
1652
if (p->flags.len > 1 && !BC_PARSE_BRACE(p))
1653
{
1654
bc_parse_endBody(p, false);
1655
}
1656
1657
return;
1658
}
1659
// With a left brace, we are parsing a body.
1660
else if (type == BC_LEX_LBRACE)
1661
{
1662
// We need to start a body if we are not expecting one yet.
1663
if (!BC_PARSE_BODY(p))
1664
{
1665
bc_parse_startBody(p, BC_PARSE_FLAG_BRACE);
1666
bc_lex_next(&p->l);
1667
}
1668
// If we *are* expecting a body, that body should get a brace. This
1669
// takes care of braces being on a different line than if and loop
1670
// headers.
1671
else
1672
{
1673
*(BC_PARSE_TOP_FLAG_PTR(p)) |= BC_PARSE_FLAG_BRACE;
1674
bc_lex_next(&p->l);
1675
bc_parse_body(p, true);
1676
}
1677
1678
// If we have reached this point, we need to return for a clean
1679
// slate.
1680
return;
1681
}
1682
// This happens when we are expecting a body and get a single statement,
1683
// i.e., a body with no braces surrounding it. Returns after for a clean
1684
// slate.
1685
else if (BC_PARSE_BODY(p) && !BC_PARSE_BRACE(p))
1686
{
1687
bc_parse_body(p, false);
1688
return;
1689
}
1690
}
1691
1692
len = p->flags.len;
1693
flags = BC_PARSE_TOP_FLAG(p);
1694
1695
switch (type)
1696
{
1697
// All of these are valid for expressions.
1698
case BC_LEX_OP_INC:
1699
case BC_LEX_OP_DEC:
1700
case BC_LEX_OP_MINUS:
1701
case BC_LEX_OP_BOOL_NOT:
1702
case BC_LEX_LPAREN:
1703
case BC_LEX_NAME:
1704
case BC_LEX_NUMBER:
1705
case BC_LEX_KW_IBASE:
1706
case BC_LEX_KW_LAST:
1707
case BC_LEX_KW_LENGTH:
1708
case BC_LEX_KW_OBASE:
1709
case BC_LEX_KW_SCALE:
1710
#if BC_ENABLE_EXTRA_MATH
1711
case BC_LEX_KW_SEED:
1712
#endif // BC_ENABLE_EXTRA_MATH
1713
case BC_LEX_KW_SQRT:
1714
case BC_LEX_KW_ABS:
1715
case BC_LEX_KW_IS_NUMBER:
1716
case BC_LEX_KW_IS_STRING:
1717
#if BC_ENABLE_EXTRA_MATH
1718
case BC_LEX_KW_IRAND:
1719
#endif // BC_ENABLE_EXTRA_MATH
1720
case BC_LEX_KW_ASCIIFY:
1721
case BC_LEX_KW_MODEXP:
1722
case BC_LEX_KW_DIVMOD:
1723
case BC_LEX_KW_READ:
1724
#if BC_ENABLE_EXTRA_MATH
1725
case BC_LEX_KW_RAND:
1726
#endif // BC_ENABLE_EXTRA_MATH
1727
case BC_LEX_KW_MAXIBASE:
1728
case BC_LEX_KW_MAXOBASE:
1729
case BC_LEX_KW_MAXSCALE:
1730
#if BC_ENABLE_EXTRA_MATH
1731
case BC_LEX_KW_MAXRAND:
1732
#endif // BC_ENABLE_EXTRA_MATH
1733
case BC_LEX_KW_LINE_LENGTH:
1734
case BC_LEX_KW_GLOBAL_STACKS:
1735
case BC_LEX_KW_LEADING_ZERO:
1736
{
1737
bc_parse_expr_status(p, BC_PARSE_PRINT, bc_parse_next_expr);
1738
break;
1739
}
1740
1741
case BC_LEX_KW_ELSE:
1742
{
1743
bc_parse_else(p);
1744
break;
1745
}
1746
1747
// Just eat.
1748
case BC_LEX_SCOLON:
1749
{
1750
// Do nothing.
1751
break;
1752
}
1753
1754
case BC_LEX_RBRACE:
1755
{
1756
bc_parse_endBody(p, true);
1757
break;
1758
}
1759
1760
case BC_LEX_STR:
1761
{
1762
bc_parse_str(p, BC_INST_PRINT_STR);
1763
break;
1764
}
1765
1766
case BC_LEX_KW_BREAK:
1767
case BC_LEX_KW_CONTINUE:
1768
{
1769
bc_parse_loopExit(p, p->l.t);
1770
break;
1771
}
1772
1773
case BC_LEX_KW_FOR:
1774
{
1775
bc_parse_for(p);
1776
break;
1777
}
1778
1779
case BC_LEX_KW_HALT:
1780
{
1781
bc_parse_push(p, BC_INST_HALT);
1782
bc_lex_next(&p->l);
1783
break;
1784
}
1785
1786
case BC_LEX_KW_IF:
1787
{
1788
bc_parse_if(p);
1789
break;
1790
}
1791
1792
case BC_LEX_KW_LIMITS:
1793
{
1794
// `limits` is a compile-time command, so execute it right away.
1795
bc_vm_printf("BC_LONG_BIT = %lu\n", (ulong) BC_LONG_BIT);
1796
bc_vm_printf("BC_BASE_DIGS = %lu\n", (ulong) BC_BASE_DIGS);
1797
bc_vm_printf("BC_BASE_POW = %lu\n", (ulong) BC_BASE_POW);
1798
bc_vm_printf("BC_OVERFLOW_MAX = %lu\n", (ulong) BC_NUM_BIGDIG_MAX);
1799
bc_vm_printf("\n");
1800
bc_vm_printf("BC_BASE_MAX = %lu\n", BC_MAX_OBASE);
1801
bc_vm_printf("BC_DIM_MAX = %lu\n", BC_MAX_DIM);
1802
bc_vm_printf("BC_SCALE_MAX = %lu\n", BC_MAX_SCALE);
1803
bc_vm_printf("BC_STRING_MAX = %lu\n", BC_MAX_STRING);
1804
bc_vm_printf("BC_NAME_MAX = %lu\n", BC_MAX_NAME);
1805
bc_vm_printf("BC_NUM_MAX = %lu\n", BC_MAX_NUM);
1806
#if BC_ENABLE_EXTRA_MATH
1807
bc_vm_printf("BC_RAND_MAX = %lu\n", BC_MAX_RAND);
1808
#endif // BC_ENABLE_EXTRA_MATH
1809
bc_vm_printf("MAX Exponent = %lu\n", BC_MAX_EXP);
1810
bc_vm_printf("Number of vars = %lu\n", BC_MAX_VARS);
1811
1812
bc_lex_next(&p->l);
1813
1814
break;
1815
}
1816
1817
case BC_LEX_KW_STREAM:
1818
case BC_LEX_KW_PRINT:
1819
{
1820
bc_parse_print(p, type);
1821
break;
1822
}
1823
1824
case BC_LEX_KW_QUIT:
1825
{
1826
// Quit is a compile-time command. We don't exit directly, so the vm
1827
// can clean up.
1828
vm->status = BC_STATUS_QUIT;
1829
BC_JMP;
1830
break;
1831
}
1832
1833
case BC_LEX_KW_RETURN:
1834
{
1835
bc_parse_return(p);
1836
break;
1837
}
1838
1839
case BC_LEX_KW_WHILE:
1840
{
1841
bc_parse_while(p);
1842
break;
1843
}
1844
1845
case BC_LEX_EOF:
1846
case BC_LEX_INVALID:
1847
case BC_LEX_NEG:
1848
#if BC_ENABLE_EXTRA_MATH
1849
case BC_LEX_OP_TRUNC:
1850
#endif // BC_ENABLE_EXTRA_MATH
1851
case BC_LEX_OP_POWER:
1852
case BC_LEX_OP_MULTIPLY:
1853
case BC_LEX_OP_DIVIDE:
1854
case BC_LEX_OP_MODULUS:
1855
case BC_LEX_OP_PLUS:
1856
#if BC_ENABLE_EXTRA_MATH
1857
case BC_LEX_OP_PLACES:
1858
case BC_LEX_OP_LSHIFT:
1859
case BC_LEX_OP_RSHIFT:
1860
#endif // BC_ENABLE_EXTRA_MATH
1861
case BC_LEX_OP_REL_EQ:
1862
case BC_LEX_OP_REL_LE:
1863
case BC_LEX_OP_REL_GE:
1864
case BC_LEX_OP_REL_NE:
1865
case BC_LEX_OP_REL_LT:
1866
case BC_LEX_OP_REL_GT:
1867
case BC_LEX_OP_BOOL_OR:
1868
case BC_LEX_OP_BOOL_AND:
1869
case BC_LEX_OP_ASSIGN_POWER:
1870
case BC_LEX_OP_ASSIGN_MULTIPLY:
1871
case BC_LEX_OP_ASSIGN_DIVIDE:
1872
case BC_LEX_OP_ASSIGN_MODULUS:
1873
case BC_LEX_OP_ASSIGN_PLUS:
1874
case BC_LEX_OP_ASSIGN_MINUS:
1875
#if BC_ENABLE_EXTRA_MATH
1876
case BC_LEX_OP_ASSIGN_PLACES:
1877
case BC_LEX_OP_ASSIGN_LSHIFT:
1878
case BC_LEX_OP_ASSIGN_RSHIFT:
1879
#endif // BC_ENABLE_EXTRA_MATH
1880
case BC_LEX_OP_ASSIGN:
1881
case BC_LEX_NLINE:
1882
case BC_LEX_WHITESPACE:
1883
case BC_LEX_RPAREN:
1884
case BC_LEX_LBRACKET:
1885
case BC_LEX_COMMA:
1886
case BC_LEX_RBRACKET:
1887
case BC_LEX_LBRACE:
1888
case BC_LEX_KW_AUTO:
1889
case BC_LEX_KW_DEFINE:
1890
#if DC_ENABLED
1891
case BC_LEX_EXTENDED_REGISTERS:
1892
case BC_LEX_EQ_NO_REG:
1893
case BC_LEX_COLON:
1894
case BC_LEX_EXECUTE:
1895
case BC_LEX_PRINT_STACK:
1896
case BC_LEX_CLEAR_STACK:
1897
case BC_LEX_REG_STACK_LEVEL:
1898
case BC_LEX_STACK_LEVEL:
1899
case BC_LEX_DUPLICATE:
1900
case BC_LEX_SWAP:
1901
case BC_LEX_POP:
1902
case BC_LEX_STORE_IBASE:
1903
case BC_LEX_STORE_OBASE:
1904
case BC_LEX_STORE_SCALE:
1905
#if BC_ENABLE_EXTRA_MATH
1906
case BC_LEX_STORE_SEED:
1907
#endif // BC_ENABLE_EXTRA_MATH
1908
case BC_LEX_LOAD:
1909
case BC_LEX_LOAD_POP:
1910
case BC_LEX_STORE_PUSH:
1911
case BC_LEX_PRINT_POP:
1912
case BC_LEX_NQUIT:
1913
case BC_LEX_EXEC_STACK_LENGTH:
1914
case BC_LEX_SCALE_FACTOR:
1915
case BC_LEX_ARRAY_LENGTH:
1916
#endif // DC_ENABLED
1917
{
1918
bc_parse_err(p, BC_ERR_PARSE_TOKEN);
1919
}
1920
}
1921
1922
// If the flags did not change, we expect a delimiter.
1923
if (len == p->flags.len && flags == BC_PARSE_TOP_FLAG(p))
1924
{
1925
if (BC_ERR(!bc_parse_isDelimiter(p)))
1926
{
1927
bc_parse_err(p, BC_ERR_PARSE_TOKEN);
1928
}
1929
}
1930
1931
// Make sure semicolons are eaten.
1932
while (p->l.t == BC_LEX_SCOLON || p->l.t == BC_LEX_NLINE)
1933
{
1934
bc_lex_next(&p->l);
1935
}
1936
1937
// POSIX's grammar does not allow a function definition after a semicolon
1938
// without a newline, so check specifically for that case and error if
1939
// the POSIX standard flag is set.
1940
if (p->l.last == BC_LEX_SCOLON && p->l.t == BC_LEX_KW_DEFINE && BC_IS_POSIX)
1941
{
1942
bc_parse_err(p, BC_ERR_POSIX_FUNC_AFTER_SEMICOLON);
1943
}
1944
}
1945
1946
void
1947
bc_parse_parse(BcParse* p)
1948
{
1949
assert(p);
1950
1951
BC_SETJMP_LOCKED(vm, exit);
1952
1953
// We should not let an EOF get here unless some partial parse was not
1954
// completed, in which case, it's the user's fault.
1955
if (BC_ERR(p->l.t == BC_LEX_EOF)) bc_parse_err(p, BC_ERR_PARSE_EOF);
1956
1957
// Functions need special parsing.
1958
else if (p->l.t == BC_LEX_KW_DEFINE)
1959
{
1960
if (BC_ERR(BC_PARSE_NO_EXEC(p)))
1961
{
1962
bc_parse_endif(p);
1963
if (BC_ERR(BC_PARSE_NO_EXEC(p)))
1964
{
1965
bc_parse_err(p, BC_ERR_PARSE_TOKEN);
1966
}
1967
}
1968
bc_parse_func(p);
1969
}
1970
1971
// Otherwise, parse a normal statement.
1972
else bc_parse_stmt(p);
1973
1974
exit:
1975
1976
// We need to reset on error.
1977
if (BC_ERR(((vm->status && vm->status != BC_STATUS_QUIT) || vm->sig != 0)))
1978
{
1979
bc_parse_reset(p);
1980
}
1981
1982
BC_LONGJMP_CONT(vm);
1983
BC_SIG_MAYLOCK;
1984
}
1985
1986
/**
1987
* Parse an expression. This is the actual implementation of the Shunting-Yard
1988
* Algorithm.
1989
* @param p The parser.
1990
* @param flags The flags for what is valid in the expression.
1991
* @param next A set of tokens for what is valid *after* the expression.
1992
* @return A parse status. In some places, an empty expression is an
1993
* error, and sometimes, it is required. This allows this function
1994
* to tell the caller if the expression was empty and let the
1995
* caller handle it.
1996
*/
1997
static BcParseStatus
1998
bc_parse_expr_err(BcParse* p, uint8_t flags, BcParseNext next)
1999
{
2000
BcInst prev = BC_INST_PRINT;
2001
uchar inst = BC_INST_INVALID;
2002
BcLexType top, t;
2003
size_t nexprs, ops_bgn;
2004
uint32_t i, nparens, nrelops;
2005
bool pfirst, rprn, array_last, done, get_token, assign;
2006
bool bin_last, incdec, can_assign;
2007
2008
// One of these *must* be true.
2009
assert(!(flags & BC_PARSE_PRINT) || !(flags & BC_PARSE_NEEDVAL));
2010
2011
// These are set very carefully. In fact, controlling the values of these
2012
// locals is the biggest part of making this work. ops_bgn especially is
2013
// important because it marks where the operator stack begins for *this*
2014
// invocation of this function. That's because bc_parse_expr_err() is
2015
// recursive (the Shunting-Yard Algorithm is most easily expressed
2016
// recursively when parsing subexpressions), and each invocation needs to
2017
// know where to stop.
2018
//
2019
// - nparens is the number of left parens without matches.
2020
// - nrelops is the number of relational operators that appear in the expr.
2021
// - nexprs is the number of unused expressions.
2022
// - rprn is a right paren encountered last.
2023
// - array_last is an array item encountered last.
2024
// - done means the expression has been fully parsed.
2025
// - get_token is true when a token is needed at the end of an iteration.
2026
// - assign is true when an assignment statement was parsed last.
2027
// - incdec is true when the previous operator was an inc or dec operator.
2028
// - can_assign is true when an assignemnt is valid.
2029
// - bin_last is true when the previous instruction was a binary operator.
2030
t = p->l.t;
2031
pfirst = (p->l.t == BC_LEX_LPAREN);
2032
nparens = nrelops = 0;
2033
nexprs = 0;
2034
ops_bgn = p->ops.len;
2035
rprn = array_last = done = get_token = assign = incdec = can_assign = false;
2036
bin_last = true;
2037
2038
// We want to eat newlines if newlines are not a valid ending token.
2039
// This is for spacing in things like for loop headers.
2040
if (!(flags & BC_PARSE_NOREAD))
2041
{
2042
while ((t = p->l.t) == BC_LEX_NLINE)
2043
{
2044
bc_lex_next(&p->l);
2045
}
2046
}
2047
2048
// This is the Shunting-Yard algorithm loop.
2049
for (; !done && BC_PARSE_EXPR(t); t = p->l.t)
2050
{
2051
// Make sure an array expression is not mixed with any others. However,
2052
// a right parenthesis may end the expression, so we will need to take
2053
// care of that right there.
2054
if (BC_ERR(array_last && t != BC_LEX_RPAREN))
2055
{
2056
bc_parse_err(p, BC_ERR_PARSE_EXPR);
2057
}
2058
2059
switch (t)
2060
{
2061
case BC_LEX_OP_INC:
2062
case BC_LEX_OP_DEC:
2063
{
2064
// These operators can only be used with items that can be
2065
// assigned to.
2066
if (BC_ERR(incdec)) bc_parse_err(p, BC_ERR_PARSE_ASSIGN);
2067
2068
bc_parse_incdec(p, &prev, &can_assign, &nexprs, flags);
2069
2070
rprn = get_token = bin_last = false;
2071
incdec = true;
2072
flags &= ~(BC_PARSE_ARRAY);
2073
2074
break;
2075
}
2076
2077
#if BC_ENABLE_EXTRA_MATH
2078
case BC_LEX_OP_TRUNC:
2079
{
2080
// The previous token must have been a leaf expression, or the
2081
// operator is in the wrong place.
2082
if (BC_ERR(!BC_PARSE_LEAF(prev, bin_last, rprn)))
2083
{
2084
bc_parse_err(p, BC_ERR_PARSE_TOKEN);
2085
}
2086
2087
// I can just add the instruction because
2088
// negative will already be taken care of.
2089
bc_parse_push(p, BC_INST_TRUNC);
2090
2091
rprn = can_assign = incdec = false;
2092
get_token = true;
2093
flags &= ~(BC_PARSE_ARRAY);
2094
2095
break;
2096
}
2097
#endif // BC_ENABLE_EXTRA_MATH
2098
2099
case BC_LEX_OP_MINUS:
2100
{
2101
bc_parse_minus(p, &prev, ops_bgn, rprn, bin_last, &nexprs);
2102
2103
rprn = get_token = can_assign = false;
2104
2105
// This is true if it was a binary operator last.
2106
bin_last = (prev == BC_INST_MINUS);
2107
if (bin_last) incdec = false;
2108
2109
flags &= ~(BC_PARSE_ARRAY);
2110
2111
break;
2112
}
2113
2114
// All of this group, including the fallthrough, is to parse binary
2115
// operators.
2116
case BC_LEX_OP_ASSIGN_POWER:
2117
case BC_LEX_OP_ASSIGN_MULTIPLY:
2118
case BC_LEX_OP_ASSIGN_DIVIDE:
2119
case BC_LEX_OP_ASSIGN_MODULUS:
2120
case BC_LEX_OP_ASSIGN_PLUS:
2121
case BC_LEX_OP_ASSIGN_MINUS:
2122
#if BC_ENABLE_EXTRA_MATH
2123
case BC_LEX_OP_ASSIGN_PLACES:
2124
case BC_LEX_OP_ASSIGN_LSHIFT:
2125
case BC_LEX_OP_ASSIGN_RSHIFT:
2126
#endif // BC_ENABLE_EXTRA_MATH
2127
case BC_LEX_OP_ASSIGN:
2128
{
2129
// We need to make sure the assignment is valid.
2130
if (!BC_PARSE_INST_VAR(prev))
2131
{
2132
bc_parse_err(p, BC_ERR_PARSE_ASSIGN);
2133
}
2134
2135
// Fallthrough.
2136
BC_FALLTHROUGH
2137
}
2138
2139
case BC_LEX_OP_POWER:
2140
case BC_LEX_OP_MULTIPLY:
2141
case BC_LEX_OP_DIVIDE:
2142
case BC_LEX_OP_MODULUS:
2143
case BC_LEX_OP_PLUS:
2144
#if BC_ENABLE_EXTRA_MATH
2145
case BC_LEX_OP_PLACES:
2146
case BC_LEX_OP_LSHIFT:
2147
case BC_LEX_OP_RSHIFT:
2148
#endif // BC_ENABLE_EXTRA_MATH
2149
case BC_LEX_OP_REL_EQ:
2150
case BC_LEX_OP_REL_LE:
2151
case BC_LEX_OP_REL_GE:
2152
case BC_LEX_OP_REL_NE:
2153
case BC_LEX_OP_REL_LT:
2154
case BC_LEX_OP_REL_GT:
2155
case BC_LEX_OP_BOOL_NOT:
2156
case BC_LEX_OP_BOOL_OR:
2157
case BC_LEX_OP_BOOL_AND:
2158
{
2159
// This is true if the operator if the token is a prefix
2160
// operator. This is only for boolean not.
2161
if (BC_PARSE_OP_PREFIX(t))
2162
{
2163
// Prefix operators are only allowed after binary operators
2164
// or prefix operators.
2165
if (BC_ERR(!bin_last && !BC_PARSE_OP_PREFIX(p->l.last)))
2166
{
2167
bc_parse_err(p, BC_ERR_PARSE_EXPR);
2168
}
2169
}
2170
// If we execute the else, that means we have a binary operator.
2171
// If the previous operator was a prefix or a binary operator,
2172
// then a binary operator is not allowed.
2173
else if (BC_ERR(BC_PARSE_PREV_PREFIX(prev) || bin_last))
2174
{
2175
bc_parse_err(p, BC_ERR_PARSE_EXPR);
2176
}
2177
2178
nrelops += (t >= BC_LEX_OP_REL_EQ && t <= BC_LEX_OP_REL_GT);
2179
prev = BC_PARSE_TOKEN_INST(t);
2180
2181
bc_parse_operator(p, t, ops_bgn, &nexprs);
2182
2183
rprn = incdec = can_assign = false;
2184
get_token = true;
2185
bin_last = !BC_PARSE_OP_PREFIX(t);
2186
flags &= ~(BC_PARSE_ARRAY);
2187
2188
break;
2189
}
2190
2191
case BC_LEX_LPAREN:
2192
{
2193
// A left paren is *not* allowed right after a leaf expr.
2194
if (BC_ERR(BC_PARSE_LEAF(prev, bin_last, rprn)))
2195
{
2196
bc_parse_err(p, BC_ERR_PARSE_EXPR);
2197
}
2198
2199
nparens += 1;
2200
rprn = incdec = can_assign = false;
2201
get_token = true;
2202
2203
// Push the paren onto the operator stack.
2204
bc_vec_push(&p->ops, &t);
2205
2206
break;
2207
}
2208
2209
case BC_LEX_RPAREN:
2210
{
2211
// This needs to be a status. The error is handled in
2212
// bc_parse_expr_status().
2213
if (BC_ERR(p->l.last == BC_LEX_LPAREN))
2214
{
2215
return BC_PARSE_STATUS_EMPTY_EXPR;
2216
}
2217
2218
// The right paren must not come after a prefix or binary
2219
// operator.
2220
if (BC_ERR(bin_last || BC_PARSE_PREV_PREFIX(prev)))
2221
{
2222
bc_parse_err(p, BC_ERR_PARSE_EXPR);
2223
}
2224
2225
// If there are no parens left, we are done, but we need another
2226
// token.
2227
if (!nparens)
2228
{
2229
done = true;
2230
get_token = false;
2231
break;
2232
}
2233
2234
// Now that we know the right paren has not ended the
2235
// expression, make sure an array expression is not mixed with
2236
// any others.
2237
if (BC_ERR(array_last))
2238
{
2239
bc_parse_err(p, BC_ERR_PARSE_EXPR);
2240
}
2241
2242
nparens -= 1;
2243
rprn = true;
2244
get_token = bin_last = incdec = false;
2245
2246
bc_parse_rightParen(p, &nexprs);
2247
2248
break;
2249
}
2250
2251
case BC_LEX_STR:
2252
{
2253
// POSIX only allows strings alone.
2254
if (BC_IS_POSIX) bc_parse_err(p, BC_ERR_POSIX_EXPR_STRING);
2255
2256
// A string is a leaf and cannot come right after a leaf.
2257
if (BC_ERR(BC_PARSE_LEAF(prev, bin_last, rprn)))
2258
{
2259
bc_parse_err(p, BC_ERR_PARSE_EXPR);
2260
}
2261
2262
bc_parse_addString(p);
2263
2264
get_token = true;
2265
bin_last = rprn = false;
2266
nexprs += 1;
2267
2268
break;
2269
}
2270
2271
case BC_LEX_NAME:
2272
{
2273
// A name is a leaf and cannot come right after a leaf.
2274
if (BC_ERR(BC_PARSE_LEAF(prev, bin_last, rprn)))
2275
{
2276
bc_parse_err(p, BC_ERR_PARSE_EXPR);
2277
}
2278
2279
get_token = bin_last = false;
2280
2281
bc_parse_name(p, &prev, &can_assign, flags & ~BC_PARSE_NOCALL);
2282
2283
rprn = (prev == BC_INST_CALL);
2284
array_last = (prev == BC_INST_ARRAY);
2285
nexprs += 1;
2286
flags &= ~(BC_PARSE_ARRAY);
2287
2288
break;
2289
}
2290
2291
case BC_LEX_NUMBER:
2292
{
2293
// A number is a leaf and cannot come right after a leaf.
2294
if (BC_ERR(BC_PARSE_LEAF(prev, bin_last, rprn)))
2295
{
2296
bc_parse_err(p, BC_ERR_PARSE_EXPR);
2297
}
2298
2299
// The number instruction is pushed in here.
2300
bc_parse_number(p);
2301
2302
nexprs += 1;
2303
prev = BC_INST_NUM;
2304
get_token = true;
2305
rprn = bin_last = can_assign = false;
2306
flags &= ~(BC_PARSE_ARRAY);
2307
2308
break;
2309
}
2310
2311
case BC_LEX_KW_IBASE:
2312
case BC_LEX_KW_LAST:
2313
case BC_LEX_KW_OBASE:
2314
#if BC_ENABLE_EXTRA_MATH
2315
case BC_LEX_KW_SEED:
2316
#endif // BC_ENABLE_EXTRA_MATH
2317
{
2318
// All of these are leaves and cannot come right after a leaf.
2319
if (BC_ERR(BC_PARSE_LEAF(prev, bin_last, rprn)))
2320
{
2321
bc_parse_err(p, BC_ERR_PARSE_EXPR);
2322
}
2323
2324
prev = t - BC_LEX_KW_LAST + BC_INST_LAST;
2325
bc_parse_push(p, prev);
2326
2327
get_token = can_assign = true;
2328
rprn = bin_last = false;
2329
nexprs += 1;
2330
flags &= ~(BC_PARSE_ARRAY);
2331
2332
break;
2333
}
2334
2335
case BC_LEX_KW_LENGTH:
2336
case BC_LEX_KW_SQRT:
2337
case BC_LEX_KW_ABS:
2338
case BC_LEX_KW_IS_NUMBER:
2339
case BC_LEX_KW_IS_STRING:
2340
#if BC_ENABLE_EXTRA_MATH
2341
case BC_LEX_KW_IRAND:
2342
#endif // BC_ENABLE_EXTRA_MATH
2343
case BC_LEX_KW_ASCIIFY:
2344
{
2345
// All of these are leaves and cannot come right after a leaf.
2346
if (BC_ERR(BC_PARSE_LEAF(prev, bin_last, rprn)))
2347
{
2348
bc_parse_err(p, BC_ERR_PARSE_EXPR);
2349
}
2350
2351
bc_parse_builtin(p, t, flags, &prev);
2352
2353
rprn = get_token = bin_last = incdec = can_assign = false;
2354
nexprs += 1;
2355
flags &= ~(BC_PARSE_ARRAY);
2356
2357
break;
2358
}
2359
2360
case BC_LEX_KW_READ:
2361
#if BC_ENABLE_EXTRA_MATH
2362
case BC_LEX_KW_RAND:
2363
#endif // BC_ENABLE_EXTRA_MATH
2364
case BC_LEX_KW_MAXIBASE:
2365
case BC_LEX_KW_MAXOBASE:
2366
case BC_LEX_KW_MAXSCALE:
2367
#if BC_ENABLE_EXTRA_MATH
2368
case BC_LEX_KW_MAXRAND:
2369
#endif // BC_ENABLE_EXTRA_MATH
2370
case BC_LEX_KW_LINE_LENGTH:
2371
case BC_LEX_KW_GLOBAL_STACKS:
2372
case BC_LEX_KW_LEADING_ZERO:
2373
{
2374
// All of these are leaves and cannot come right after a leaf.
2375
if (BC_ERR(BC_PARSE_LEAF(prev, bin_last, rprn)))
2376
{
2377
bc_parse_err(p, BC_ERR_PARSE_EXPR);
2378
}
2379
2380
// Error if we have read and it's not allowed.
2381
else if (t == BC_LEX_KW_READ && BC_ERR(flags & BC_PARSE_NOREAD))
2382
{
2383
bc_parse_err(p, BC_ERR_EXEC_REC_READ);
2384
}
2385
2386
prev = t - BC_LEX_KW_READ + BC_INST_READ;
2387
bc_parse_noArgBuiltin(p, prev);
2388
2389
rprn = get_token = bin_last = incdec = can_assign = false;
2390
nexprs += 1;
2391
flags &= ~(BC_PARSE_ARRAY);
2392
2393
break;
2394
}
2395
2396
case BC_LEX_KW_SCALE:
2397
{
2398
// This is a leaf and cannot come right after a leaf.
2399
if (BC_ERR(BC_PARSE_LEAF(prev, bin_last, rprn)))
2400
{
2401
bc_parse_err(p, BC_ERR_PARSE_EXPR);
2402
}
2403
2404
// Scale needs special work because it can be a variable *or* a
2405
// function.
2406
bc_parse_scale(p, &prev, &can_assign, flags);
2407
2408
rprn = get_token = bin_last = false;
2409
nexprs += 1;
2410
flags &= ~(BC_PARSE_ARRAY);
2411
2412
break;
2413
}
2414
2415
case BC_LEX_KW_MODEXP:
2416
case BC_LEX_KW_DIVMOD:
2417
{
2418
// This is a leaf and cannot come right after a leaf.
2419
if (BC_ERR(BC_PARSE_LEAF(prev, bin_last, rprn)))
2420
{
2421
bc_parse_err(p, BC_ERR_PARSE_EXPR);
2422
}
2423
2424
bc_parse_builtin3(p, t, flags, &prev);
2425
2426
rprn = get_token = bin_last = incdec = can_assign = false;
2427
nexprs += 1;
2428
flags &= ~(BC_PARSE_ARRAY);
2429
2430
break;
2431
}
2432
2433
case BC_LEX_EOF:
2434
case BC_LEX_INVALID:
2435
case BC_LEX_NEG:
2436
case BC_LEX_NLINE:
2437
case BC_LEX_WHITESPACE:
2438
case BC_LEX_LBRACKET:
2439
case BC_LEX_COMMA:
2440
case BC_LEX_RBRACKET:
2441
case BC_LEX_LBRACE:
2442
case BC_LEX_SCOLON:
2443
case BC_LEX_RBRACE:
2444
case BC_LEX_KW_AUTO:
2445
case BC_LEX_KW_BREAK:
2446
case BC_LEX_KW_CONTINUE:
2447
case BC_LEX_KW_DEFINE:
2448
case BC_LEX_KW_FOR:
2449
case BC_LEX_KW_IF:
2450
case BC_LEX_KW_LIMITS:
2451
case BC_LEX_KW_RETURN:
2452
case BC_LEX_KW_WHILE:
2453
case BC_LEX_KW_HALT:
2454
case BC_LEX_KW_PRINT:
2455
case BC_LEX_KW_QUIT:
2456
case BC_LEX_KW_STREAM:
2457
case BC_LEX_KW_ELSE:
2458
#if DC_ENABLED
2459
case BC_LEX_EXTENDED_REGISTERS:
2460
case BC_LEX_EQ_NO_REG:
2461
case BC_LEX_COLON:
2462
case BC_LEX_EXECUTE:
2463
case BC_LEX_PRINT_STACK:
2464
case BC_LEX_CLEAR_STACK:
2465
case BC_LEX_REG_STACK_LEVEL:
2466
case BC_LEX_STACK_LEVEL:
2467
case BC_LEX_DUPLICATE:
2468
case BC_LEX_SWAP:
2469
case BC_LEX_POP:
2470
case BC_LEX_STORE_IBASE:
2471
case BC_LEX_STORE_OBASE:
2472
case BC_LEX_STORE_SCALE:
2473
#if BC_ENABLE_EXTRA_MATH
2474
case BC_LEX_STORE_SEED:
2475
#endif // BC_ENABLE_EXTRA_MATH
2476
case BC_LEX_LOAD:
2477
case BC_LEX_LOAD_POP:
2478
case BC_LEX_STORE_PUSH:
2479
case BC_LEX_PRINT_POP:
2480
case BC_LEX_NQUIT:
2481
case BC_LEX_EXEC_STACK_LENGTH:
2482
case BC_LEX_SCALE_FACTOR:
2483
case BC_LEX_ARRAY_LENGTH:
2484
#endif // DC_ENABLED
2485
{
2486
#if BC_DEBUG
2487
// We should never get here, even in debug builds.
2488
bc_parse_err(p, BC_ERR_PARSE_TOKEN);
2489
break;
2490
#endif // BC_DEBUG
2491
}
2492
}
2493
2494
if (get_token) bc_lex_next(&p->l);
2495
}
2496
2497
// Now that we have parsed the expression, we need to empty the operator
2498
// stack.
2499
while (p->ops.len > ops_bgn)
2500
{
2501
top = BC_PARSE_TOP_OP(p);
2502
assign = top >= BC_LEX_OP_ASSIGN_POWER && top <= BC_LEX_OP_ASSIGN;
2503
2504
// There should not be *any* parens on the stack anymore.
2505
if (BC_ERR(top == BC_LEX_LPAREN || top == BC_LEX_RPAREN))
2506
{
2507
bc_parse_err(p, BC_ERR_PARSE_EXPR);
2508
}
2509
2510
bc_parse_push(p, BC_PARSE_TOKEN_INST(top));
2511
2512
// Adjust the number of unused expressions.
2513
nexprs -= !BC_PARSE_OP_PREFIX(top);
2514
bc_vec_pop(&p->ops);
2515
2516
incdec = false;
2517
}
2518
2519
// There must be only one expression at the top.
2520
if (BC_ERR(nexprs != 1)) bc_parse_err(p, BC_ERR_PARSE_EXPR);
2521
2522
// Check that the next token is correct.
2523
for (i = 0; i < next.len && t != next.tokens[i]; ++i)
2524
{
2525
continue;
2526
}
2527
if (BC_ERR(i == next.len && !bc_parse_isDelimiter(p)))
2528
{
2529
bc_parse_err(p, BC_ERR_PARSE_EXPR);
2530
}
2531
2532
// Check that POSIX would be happy with the number of relational operators.
2533
if (!(flags & BC_PARSE_REL) && nrelops)
2534
{
2535
bc_parse_err(p, BC_ERR_POSIX_REL_POS);
2536
}
2537
else if ((flags & BC_PARSE_REL) && nrelops > 1)
2538
{
2539
bc_parse_err(p, BC_ERR_POSIX_MULTIREL);
2540
}
2541
2542
// If this is true, then we might be in a situation where we don't print.
2543
// We would want to have the increment/decrement operator not make an extra
2544
// copy if it's not necessary.
2545
if (!(flags & BC_PARSE_NEEDVAL) && !pfirst)
2546
{
2547
// We have the easy case if the last operator was an assignment
2548
// operator.
2549
if (assign)
2550
{
2551
inst = *((uchar*) bc_vec_top(&p->func->code));
2552
inst += (BC_INST_ASSIGN_POWER_NO_VAL - BC_INST_ASSIGN_POWER);
2553
incdec = false;
2554
}
2555
// If we have an inc/dec operator and we are *not* printing, implement
2556
// the optimization to get rid of the extra copy.
2557
else if (incdec && !(flags & BC_PARSE_PRINT))
2558
{
2559
inst = *((uchar*) bc_vec_top(&p->func->code));
2560
incdec = (inst <= BC_INST_DEC);
2561
inst = BC_INST_ASSIGN_PLUS_NO_VAL +
2562
(inst != BC_INST_INC && inst != BC_INST_ASSIGN_PLUS);
2563
}
2564
2565
// This condition allows us to change the previous assignment
2566
// instruction (which does a copy) for a NO_VAL version, which does not.
2567
// This condition is set if either of the above if statements ends up
2568
// being true.
2569
if (inst >= BC_INST_ASSIGN_POWER_NO_VAL &&
2570
inst <= BC_INST_ASSIGN_NO_VAL)
2571
{
2572
// Pop the previous assignment instruction and push a new one.
2573
// Inc/dec needs the extra instruction because it is now a binary
2574
// operator and needs a second operand.
2575
bc_vec_pop(&p->func->code);
2576
if (incdec) bc_parse_push(p, BC_INST_ONE);
2577
bc_parse_push(p, inst);
2578
}
2579
}
2580
2581
// If we might have to print...
2582
if ((flags & BC_PARSE_PRINT))
2583
{
2584
// With a paren first or the last operator not being an assignment, we
2585
// *do* want to print.
2586
if (pfirst || !assign) bc_parse_push(p, BC_INST_PRINT);
2587
}
2588
// We need to make sure to push a pop instruction for assignment statements
2589
// that will not print. The print will pop, but without it, we need to pop.
2590
else if (!(flags & BC_PARSE_NEEDVAL) &&
2591
(inst < BC_INST_ASSIGN_POWER_NO_VAL ||
2592
inst > BC_INST_ASSIGN_NO_VAL))
2593
{
2594
bc_parse_push(p, BC_INST_POP);
2595
}
2596
2597
// We want to eat newlines if newlines are not a valid ending token.
2598
// This is for spacing in things like for loop headers.
2599
//
2600
// Yes, this is one case where I reuse a variable for a different purpose;
2601
// in this case, incdec being true now means that newlines are not valid.
2602
for (incdec = true, i = 0; i < next.len && incdec; ++i)
2603
{
2604
incdec = (next.tokens[i] != BC_LEX_NLINE);
2605
}
2606
if (incdec)
2607
{
2608
while (p->l.t == BC_LEX_NLINE)
2609
{
2610
bc_lex_next(&p->l);
2611
}
2612
}
2613
2614
return BC_PARSE_STATUS_SUCCESS;
2615
}
2616
2617
/**
2618
* Parses an expression with bc_parse_expr_err(), but throws an error if it gets
2619
* an empty expression.
2620
* @param p The parser.
2621
* @param flags The flags for what is valid in the expression.
2622
* @param next A set of tokens for what is valid *after* the expression.
2623
*/
2624
static void
2625
bc_parse_expr_status(BcParse* p, uint8_t flags, BcParseNext next)
2626
{
2627
BcParseStatus s = bc_parse_expr_err(p, flags, next);
2628
2629
if (BC_ERR(s == BC_PARSE_STATUS_EMPTY_EXPR))
2630
{
2631
bc_parse_err(p, BC_ERR_PARSE_EMPTY_EXPR);
2632
}
2633
}
2634
2635
void
2636
bc_parse_expr(BcParse* p, uint8_t flags)
2637
{
2638
assert(p);
2639
bc_parse_expr_status(p, flags, bc_parse_next_read);
2640
}
2641
#endif // BC_ENABLED
2642
2643