]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/bc/src/bc_parse.c
zfs: merge openzfs/zfs@688514e47
[FreeBSD/FreeBSD.git] / contrib / bc / src / bc_parse.c
1 /*
2  * *****************************************************************************
3  *
4  * SPDX-License-Identifier: BSD-2-Clause
5  *
6  * Copyright (c) 2018-2023 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, done, get_token, assign, bin_last, incdec, can_assign;
2006
2007         // One of these *must* be true.
2008         assert(!(flags & BC_PARSE_PRINT) || !(flags & BC_PARSE_NEEDVAL));
2009
2010         // These are set very carefully. In fact, controlling the values of these
2011         // locals is the biggest part of making this work. ops_bgn especially is
2012         // important because it marks where the operator stack begins for *this*
2013         // invocation of this function. That's because bc_parse_expr_err() is
2014         // recursive (the Shunting-Yard Algorithm is most easily expressed
2015         // recursively when parsing subexpressions), and each invocation needs to
2016         // know where to stop.
2017         //
2018         // - nparens is the number of left parens without matches.
2019         // - nrelops is the number of relational operators that appear in the expr.
2020         // - nexprs is the number of unused expressions.
2021         // - rprn is a right paren encountered last.
2022         // - done means the expression has been fully parsed.
2023         // - get_token is true when a token is needed at the end of an iteration.
2024         // - assign is true when an assignment statement was parsed last.
2025         // - incdec is true when the previous operator was an inc or dec operator.
2026         // - can_assign is true when an assignemnt is valid.
2027         // - bin_last is true when the previous instruction was a binary operator.
2028         t = p->l.t;
2029         pfirst = (p->l.t == BC_LEX_LPAREN);
2030         nparens = nrelops = 0;
2031         nexprs = 0;
2032         ops_bgn = p->ops.len;
2033         rprn = done = get_token = assign = incdec = can_assign = false;
2034         bin_last = true;
2035
2036         // We want to eat newlines if newlines are not a valid ending token.
2037         // This is for spacing in things like for loop headers.
2038         if (!(flags & BC_PARSE_NOREAD))
2039         {
2040                 while ((t = p->l.t) == BC_LEX_NLINE)
2041                 {
2042                         bc_lex_next(&p->l);
2043                 }
2044         }
2045
2046         // This is the Shunting-Yard algorithm loop.
2047         for (; !done && BC_PARSE_EXPR(t); t = p->l.t)
2048         {
2049                 switch (t)
2050                 {
2051                         case BC_LEX_OP_INC:
2052                         case BC_LEX_OP_DEC:
2053                         {
2054                                 // These operators can only be used with items that can be
2055                                 // assigned to.
2056                                 if (BC_ERR(incdec)) bc_parse_err(p, BC_ERR_PARSE_ASSIGN);
2057
2058                                 bc_parse_incdec(p, &prev, &can_assign, &nexprs, flags);
2059
2060                                 rprn = get_token = bin_last = false;
2061                                 incdec = true;
2062                                 flags &= ~(BC_PARSE_ARRAY);
2063
2064                                 break;
2065                         }
2066
2067 #if BC_ENABLE_EXTRA_MATH
2068                         case BC_LEX_OP_TRUNC:
2069                         {
2070                                 // The previous token must have been a leaf expression, or the
2071                                 // operator is in the wrong place.
2072                                 if (BC_ERR(!BC_PARSE_LEAF(prev, bin_last, rprn)))
2073                                 {
2074                                         bc_parse_err(p, BC_ERR_PARSE_TOKEN);
2075                                 }
2076
2077                                 // I can just add the instruction because
2078                                 // negative will already be taken care of.
2079                                 bc_parse_push(p, BC_INST_TRUNC);
2080
2081                                 rprn = can_assign = incdec = false;
2082                                 get_token = true;
2083                                 flags &= ~(BC_PARSE_ARRAY);
2084
2085                                 break;
2086                         }
2087 #endif // BC_ENABLE_EXTRA_MATH
2088
2089                         case BC_LEX_OP_MINUS:
2090                         {
2091                                 bc_parse_minus(p, &prev, ops_bgn, rprn, bin_last, &nexprs);
2092
2093                                 rprn = get_token = can_assign = false;
2094
2095                                 // This is true if it was a binary operator last.
2096                                 bin_last = (prev == BC_INST_MINUS);
2097                                 if (bin_last) incdec = false;
2098
2099                                 flags &= ~(BC_PARSE_ARRAY);
2100
2101                                 break;
2102                         }
2103
2104                         // All of this group, including the fallthrough, is to parse binary
2105                         // operators.
2106                         case BC_LEX_OP_ASSIGN_POWER:
2107                         case BC_LEX_OP_ASSIGN_MULTIPLY:
2108                         case BC_LEX_OP_ASSIGN_DIVIDE:
2109                         case BC_LEX_OP_ASSIGN_MODULUS:
2110                         case BC_LEX_OP_ASSIGN_PLUS:
2111                         case BC_LEX_OP_ASSIGN_MINUS:
2112 #if BC_ENABLE_EXTRA_MATH
2113                         case BC_LEX_OP_ASSIGN_PLACES:
2114                         case BC_LEX_OP_ASSIGN_LSHIFT:
2115                         case BC_LEX_OP_ASSIGN_RSHIFT:
2116 #endif // BC_ENABLE_EXTRA_MATH
2117                         case BC_LEX_OP_ASSIGN:
2118                         {
2119                                 // We need to make sure the assignment is valid.
2120                                 if (!BC_PARSE_INST_VAR(prev))
2121                                 {
2122                                         bc_parse_err(p, BC_ERR_PARSE_ASSIGN);
2123                                 }
2124
2125                                 // Fallthrough.
2126                                 BC_FALLTHROUGH
2127                         }
2128
2129                         case BC_LEX_OP_POWER:
2130                         case BC_LEX_OP_MULTIPLY:
2131                         case BC_LEX_OP_DIVIDE:
2132                         case BC_LEX_OP_MODULUS:
2133                         case BC_LEX_OP_PLUS:
2134 #if BC_ENABLE_EXTRA_MATH
2135                         case BC_LEX_OP_PLACES:
2136                         case BC_LEX_OP_LSHIFT:
2137                         case BC_LEX_OP_RSHIFT:
2138 #endif // BC_ENABLE_EXTRA_MATH
2139                         case BC_LEX_OP_REL_EQ:
2140                         case BC_LEX_OP_REL_LE:
2141                         case BC_LEX_OP_REL_GE:
2142                         case BC_LEX_OP_REL_NE:
2143                         case BC_LEX_OP_REL_LT:
2144                         case BC_LEX_OP_REL_GT:
2145                         case BC_LEX_OP_BOOL_NOT:
2146                         case BC_LEX_OP_BOOL_OR:
2147                         case BC_LEX_OP_BOOL_AND:
2148                         {
2149                                 // This is true if the operator if the token is a prefix
2150                                 // operator. This is only for boolean not.
2151                                 if (BC_PARSE_OP_PREFIX(t))
2152                                 {
2153                                         // Prefix operators are only allowed after binary operators
2154                                         // or prefix operators.
2155                                         if (BC_ERR(!bin_last && !BC_PARSE_OP_PREFIX(p->l.last)))
2156                                         {
2157                                                 bc_parse_err(p, BC_ERR_PARSE_EXPR);
2158                                         }
2159                                 }
2160                                 // If we execute the else, that means we have a binary operator.
2161                                 // If the previous operator was a prefix or a binary operator,
2162                                 // then a binary operator is not allowed.
2163                                 else if (BC_ERR(BC_PARSE_PREV_PREFIX(prev) || bin_last))
2164                                 {
2165                                         bc_parse_err(p, BC_ERR_PARSE_EXPR);
2166                                 }
2167
2168                                 nrelops += (t >= BC_LEX_OP_REL_EQ && t <= BC_LEX_OP_REL_GT);
2169                                 prev = BC_PARSE_TOKEN_INST(t);
2170
2171                                 bc_parse_operator(p, t, ops_bgn, &nexprs);
2172
2173                                 rprn = incdec = can_assign = false;
2174                                 get_token = true;
2175                                 bin_last = !BC_PARSE_OP_PREFIX(t);
2176                                 flags &= ~(BC_PARSE_ARRAY);
2177
2178                                 break;
2179                         }
2180
2181                         case BC_LEX_LPAREN:
2182                         {
2183                                 // A left paren is *not* allowed right after a leaf expr.
2184                                 if (BC_ERR(BC_PARSE_LEAF(prev, bin_last, rprn)))
2185                                 {
2186                                         bc_parse_err(p, BC_ERR_PARSE_EXPR);
2187                                 }
2188
2189                                 nparens += 1;
2190                                 rprn = incdec = can_assign = false;
2191                                 get_token = true;
2192
2193                                 // Push the paren onto the operator stack.
2194                                 bc_vec_push(&p->ops, &t);
2195
2196                                 break;
2197                         }
2198
2199                         case BC_LEX_RPAREN:
2200                         {
2201                                 // This needs to be a status. The error is handled in
2202                                 // bc_parse_expr_status().
2203                                 if (BC_ERR(p->l.last == BC_LEX_LPAREN))
2204                                 {
2205                                         return BC_PARSE_STATUS_EMPTY_EXPR;
2206                                 }
2207
2208                                 // The right paren must not come after a prefix or binary
2209                                 // operator.
2210                                 if (BC_ERR(bin_last || BC_PARSE_PREV_PREFIX(prev)))
2211                                 {
2212                                         bc_parse_err(p, BC_ERR_PARSE_EXPR);
2213                                 }
2214
2215                                 // If there are no parens left, we are done, but we need another
2216                                 // token.
2217                                 if (!nparens)
2218                                 {
2219                                         done = true;
2220                                         get_token = false;
2221                                         break;
2222                                 }
2223
2224                                 nparens -= 1;
2225                                 rprn = true;
2226                                 get_token = bin_last = incdec = false;
2227
2228                                 bc_parse_rightParen(p, &nexprs);
2229
2230                                 break;
2231                         }
2232
2233                         case BC_LEX_STR:
2234                         {
2235                                 // POSIX only allows strings alone.
2236                                 if (BC_IS_POSIX) bc_parse_err(p, BC_ERR_POSIX_EXPR_STRING);
2237
2238                                 // A string is a leaf and cannot come right after a leaf.
2239                                 if (BC_ERR(BC_PARSE_LEAF(prev, bin_last, rprn)))
2240                                 {
2241                                         bc_parse_err(p, BC_ERR_PARSE_EXPR);
2242                                 }
2243
2244                                 bc_parse_addString(p);
2245
2246                                 get_token = true;
2247                                 bin_last = rprn = false;
2248                                 nexprs += 1;
2249
2250                                 break;
2251                         }
2252
2253                         case BC_LEX_NAME:
2254                         {
2255                                 // A name is a leaf and cannot come right after a leaf.
2256                                 if (BC_ERR(BC_PARSE_LEAF(prev, bin_last, rprn)))
2257                                 {
2258                                         bc_parse_err(p, BC_ERR_PARSE_EXPR);
2259                                 }
2260
2261                                 get_token = bin_last = false;
2262
2263                                 bc_parse_name(p, &prev, &can_assign, flags & ~BC_PARSE_NOCALL);
2264
2265                                 rprn = (prev == BC_INST_CALL);
2266                                 nexprs += 1;
2267                                 flags &= ~(BC_PARSE_ARRAY);
2268
2269                                 break;
2270                         }
2271
2272                         case BC_LEX_NUMBER:
2273                         {
2274                                 // A number is a leaf and cannot come right after a leaf.
2275                                 if (BC_ERR(BC_PARSE_LEAF(prev, bin_last, rprn)))
2276                                 {
2277                                         bc_parse_err(p, BC_ERR_PARSE_EXPR);
2278                                 }
2279
2280                                 // The number instruction is pushed in here.
2281                                 bc_parse_number(p);
2282
2283                                 nexprs += 1;
2284                                 prev = BC_INST_NUM;
2285                                 get_token = true;
2286                                 rprn = bin_last = can_assign = false;
2287                                 flags &= ~(BC_PARSE_ARRAY);
2288
2289                                 break;
2290                         }
2291
2292                         case BC_LEX_KW_IBASE:
2293                         case BC_LEX_KW_LAST:
2294                         case BC_LEX_KW_OBASE:
2295 #if BC_ENABLE_EXTRA_MATH
2296                         case BC_LEX_KW_SEED:
2297 #endif // BC_ENABLE_EXTRA_MATH
2298                         {
2299                                 // All of these are leaves and cannot come right after a leaf.
2300                                 if (BC_ERR(BC_PARSE_LEAF(prev, bin_last, rprn)))
2301                                 {
2302                                         bc_parse_err(p, BC_ERR_PARSE_EXPR);
2303                                 }
2304
2305                                 prev = t - BC_LEX_KW_LAST + BC_INST_LAST;
2306                                 bc_parse_push(p, prev);
2307
2308                                 get_token = can_assign = true;
2309                                 rprn = bin_last = false;
2310                                 nexprs += 1;
2311                                 flags &= ~(BC_PARSE_ARRAY);
2312
2313                                 break;
2314                         }
2315
2316                         case BC_LEX_KW_LENGTH:
2317                         case BC_LEX_KW_SQRT:
2318                         case BC_LEX_KW_ABS:
2319                         case BC_LEX_KW_IS_NUMBER:
2320                         case BC_LEX_KW_IS_STRING:
2321 #if BC_ENABLE_EXTRA_MATH
2322                         case BC_LEX_KW_IRAND:
2323 #endif // BC_ENABLE_EXTRA_MATH
2324                         case BC_LEX_KW_ASCIIFY:
2325                         {
2326                                 // All of these are leaves and cannot come right after a leaf.
2327                                 if (BC_ERR(BC_PARSE_LEAF(prev, bin_last, rprn)))
2328                                 {
2329                                         bc_parse_err(p, BC_ERR_PARSE_EXPR);
2330                                 }
2331
2332                                 bc_parse_builtin(p, t, flags, &prev);
2333
2334                                 rprn = get_token = bin_last = incdec = can_assign = false;
2335                                 nexprs += 1;
2336                                 flags &= ~(BC_PARSE_ARRAY);
2337
2338                                 break;
2339                         }
2340
2341                         case BC_LEX_KW_READ:
2342 #if BC_ENABLE_EXTRA_MATH
2343                         case BC_LEX_KW_RAND:
2344 #endif // BC_ENABLE_EXTRA_MATH
2345                         case BC_LEX_KW_MAXIBASE:
2346                         case BC_LEX_KW_MAXOBASE:
2347                         case BC_LEX_KW_MAXSCALE:
2348 #if BC_ENABLE_EXTRA_MATH
2349                         case BC_LEX_KW_MAXRAND:
2350 #endif // BC_ENABLE_EXTRA_MATH
2351                         case BC_LEX_KW_LINE_LENGTH:
2352                         case BC_LEX_KW_GLOBAL_STACKS:
2353                         case BC_LEX_KW_LEADING_ZERO:
2354                         {
2355                                 // All of these are leaves and cannot come right after a leaf.
2356                                 if (BC_ERR(BC_PARSE_LEAF(prev, bin_last, rprn)))
2357                                 {
2358                                         bc_parse_err(p, BC_ERR_PARSE_EXPR);
2359                                 }
2360
2361                                 // Error if we have read and it's not allowed.
2362                                 else if (t == BC_LEX_KW_READ && BC_ERR(flags & BC_PARSE_NOREAD))
2363                                 {
2364                                         bc_parse_err(p, BC_ERR_EXEC_REC_READ);
2365                                 }
2366
2367                                 prev = t - BC_LEX_KW_READ + BC_INST_READ;
2368                                 bc_parse_noArgBuiltin(p, prev);
2369
2370                                 rprn = get_token = bin_last = incdec = can_assign = false;
2371                                 nexprs += 1;
2372                                 flags &= ~(BC_PARSE_ARRAY);
2373
2374                                 break;
2375                         }
2376
2377                         case BC_LEX_KW_SCALE:
2378                         {
2379                                 // This is a leaf and cannot come right after a leaf.
2380                                 if (BC_ERR(BC_PARSE_LEAF(prev, bin_last, rprn)))
2381                                 {
2382                                         bc_parse_err(p, BC_ERR_PARSE_EXPR);
2383                                 }
2384
2385                                 // Scale needs special work because it can be a variable *or* a
2386                                 // function.
2387                                 bc_parse_scale(p, &prev, &can_assign, flags);
2388
2389                                 rprn = get_token = bin_last = false;
2390                                 nexprs += 1;
2391                                 flags &= ~(BC_PARSE_ARRAY);
2392
2393                                 break;
2394                         }
2395
2396                         case BC_LEX_KW_MODEXP:
2397                         case BC_LEX_KW_DIVMOD:
2398                         {
2399                                 // This is a leaf and cannot come right after a leaf.
2400                                 if (BC_ERR(BC_PARSE_LEAF(prev, bin_last, rprn)))
2401                                 {
2402                                         bc_parse_err(p, BC_ERR_PARSE_EXPR);
2403                                 }
2404
2405                                 bc_parse_builtin3(p, t, flags, &prev);
2406
2407                                 rprn = get_token = bin_last = incdec = can_assign = false;
2408                                 nexprs += 1;
2409                                 flags &= ~(BC_PARSE_ARRAY);
2410
2411                                 break;
2412                         }
2413
2414                         case BC_LEX_EOF:
2415                         case BC_LEX_INVALID:
2416                         case BC_LEX_NEG:
2417                         case BC_LEX_NLINE:
2418                         case BC_LEX_WHITESPACE:
2419                         case BC_LEX_LBRACKET:
2420                         case BC_LEX_COMMA:
2421                         case BC_LEX_RBRACKET:
2422                         case BC_LEX_LBRACE:
2423                         case BC_LEX_SCOLON:
2424                         case BC_LEX_RBRACE:
2425                         case BC_LEX_KW_AUTO:
2426                         case BC_LEX_KW_BREAK:
2427                         case BC_LEX_KW_CONTINUE:
2428                         case BC_LEX_KW_DEFINE:
2429                         case BC_LEX_KW_FOR:
2430                         case BC_LEX_KW_IF:
2431                         case BC_LEX_KW_LIMITS:
2432                         case BC_LEX_KW_RETURN:
2433                         case BC_LEX_KW_WHILE:
2434                         case BC_LEX_KW_HALT:
2435                         case BC_LEX_KW_PRINT:
2436                         case BC_LEX_KW_QUIT:
2437                         case BC_LEX_KW_STREAM:
2438                         case BC_LEX_KW_ELSE:
2439 #if DC_ENABLED
2440                         case BC_LEX_EXTENDED_REGISTERS:
2441                         case BC_LEX_EQ_NO_REG:
2442                         case BC_LEX_COLON:
2443                         case BC_LEX_EXECUTE:
2444                         case BC_LEX_PRINT_STACK:
2445                         case BC_LEX_CLEAR_STACK:
2446                         case BC_LEX_REG_STACK_LEVEL:
2447                         case BC_LEX_STACK_LEVEL:
2448                         case BC_LEX_DUPLICATE:
2449                         case BC_LEX_SWAP:
2450                         case BC_LEX_POP:
2451                         case BC_LEX_STORE_IBASE:
2452                         case BC_LEX_STORE_OBASE:
2453                         case BC_LEX_STORE_SCALE:
2454 #if BC_ENABLE_EXTRA_MATH
2455                         case BC_LEX_STORE_SEED:
2456 #endif // BC_ENABLE_EXTRA_MATH
2457                         case BC_LEX_LOAD:
2458                         case BC_LEX_LOAD_POP:
2459                         case BC_LEX_STORE_PUSH:
2460                         case BC_LEX_PRINT_POP:
2461                         case BC_LEX_NQUIT:
2462                         case BC_LEX_EXEC_STACK_LENGTH:
2463                         case BC_LEX_SCALE_FACTOR:
2464                         case BC_LEX_ARRAY_LENGTH:
2465 #endif // DC_ENABLED
2466                         {
2467 #if BC_DEBUG
2468                                 // We should never get here, even in debug builds.
2469                                 bc_parse_err(p, BC_ERR_PARSE_TOKEN);
2470                                 break;
2471 #endif // BC_DEBUG
2472                         }
2473                 }
2474
2475                 if (get_token) bc_lex_next(&p->l);
2476         }
2477
2478         // Now that we have parsed the expression, we need to empty the operator
2479         // stack.
2480         while (p->ops.len > ops_bgn)
2481         {
2482                 top = BC_PARSE_TOP_OP(p);
2483                 assign = top >= BC_LEX_OP_ASSIGN_POWER && top <= BC_LEX_OP_ASSIGN;
2484
2485                 // There should not be *any* parens on the stack anymore.
2486                 if (BC_ERR(top == BC_LEX_LPAREN || top == BC_LEX_RPAREN))
2487                 {
2488                         bc_parse_err(p, BC_ERR_PARSE_EXPR);
2489                 }
2490
2491                 bc_parse_push(p, BC_PARSE_TOKEN_INST(top));
2492
2493                 // Adjust the number of unused expressions.
2494                 nexprs -= !BC_PARSE_OP_PREFIX(top);
2495                 bc_vec_pop(&p->ops);
2496
2497                 incdec = false;
2498         }
2499
2500         // There must be only one expression at the top.
2501         if (BC_ERR(nexprs != 1)) bc_parse_err(p, BC_ERR_PARSE_EXPR);
2502
2503         // Check that the next token is correct.
2504         for (i = 0; i < next.len && t != next.tokens[i]; ++i)
2505         {
2506                 continue;
2507         }
2508         if (BC_ERR(i == next.len && !bc_parse_isDelimiter(p)))
2509         {
2510                 bc_parse_err(p, BC_ERR_PARSE_EXPR);
2511         }
2512
2513         // Check that POSIX would be happy with the number of relational operators.
2514         if (!(flags & BC_PARSE_REL) && nrelops)
2515         {
2516                 bc_parse_err(p, BC_ERR_POSIX_REL_POS);
2517         }
2518         else if ((flags & BC_PARSE_REL) && nrelops > 1)
2519         {
2520                 bc_parse_err(p, BC_ERR_POSIX_MULTIREL);
2521         }
2522
2523         // If this is true, then we might be in a situation where we don't print.
2524         // We would want to have the increment/decrement operator not make an extra
2525         // copy if it's not necessary.
2526         if (!(flags & BC_PARSE_NEEDVAL) && !pfirst)
2527         {
2528                 // We have the easy case if the last operator was an assignment
2529                 // operator.
2530                 if (assign)
2531                 {
2532                         inst = *((uchar*) bc_vec_top(&p->func->code));
2533                         inst += (BC_INST_ASSIGN_POWER_NO_VAL - BC_INST_ASSIGN_POWER);
2534                         incdec = false;
2535                 }
2536                 // If we have an inc/dec operator and we are *not* printing, implement
2537                 // the optimization to get rid of the extra copy.
2538                 else if (incdec && !(flags & BC_PARSE_PRINT))
2539                 {
2540                         inst = *((uchar*) bc_vec_top(&p->func->code));
2541                         incdec = (inst <= BC_INST_DEC);
2542                         inst = BC_INST_ASSIGN_PLUS_NO_VAL +
2543                                (inst != BC_INST_INC && inst != BC_INST_ASSIGN_PLUS);
2544                 }
2545
2546                 // This condition allows us to change the previous assignment
2547                 // instruction (which does a copy) for a NO_VAL version, which does not.
2548                 // This condition is set if either of the above if statements ends up
2549                 // being true.
2550                 if (inst >= BC_INST_ASSIGN_POWER_NO_VAL &&
2551                     inst <= BC_INST_ASSIGN_NO_VAL)
2552                 {
2553                         // Pop the previous assignment instruction and push a new one.
2554                         // Inc/dec needs the extra instruction because it is now a binary
2555                         // operator and needs a second operand.
2556                         bc_vec_pop(&p->func->code);
2557                         if (incdec) bc_parse_push(p, BC_INST_ONE);
2558                         bc_parse_push(p, inst);
2559                 }
2560         }
2561
2562         // If we might have to print...
2563         if ((flags & BC_PARSE_PRINT))
2564         {
2565                 // With a paren first or the last operator not being an assignment, we
2566                 // *do* want to print.
2567                 if (pfirst || !assign) bc_parse_push(p, BC_INST_PRINT);
2568         }
2569         // We need to make sure to push a pop instruction for assignment statements
2570         // that will not print. The print will pop, but without it, we need to pop.
2571         else if (!(flags & BC_PARSE_NEEDVAL) &&
2572                  (inst < BC_INST_ASSIGN_POWER_NO_VAL ||
2573                   inst > BC_INST_ASSIGN_NO_VAL))
2574         {
2575                 bc_parse_push(p, BC_INST_POP);
2576         }
2577
2578         // We want to eat newlines if newlines are not a valid ending token.
2579         // This is for spacing in things like for loop headers.
2580         //
2581         // Yes, this is one case where I reuse a variable for a different purpose;
2582         // in this case, incdec being true now means that newlines are not valid.
2583         for (incdec = true, i = 0; i < next.len && incdec; ++i)
2584         {
2585                 incdec = (next.tokens[i] != BC_LEX_NLINE);
2586         }
2587         if (incdec)
2588         {
2589                 while (p->l.t == BC_LEX_NLINE)
2590                 {
2591                         bc_lex_next(&p->l);
2592                 }
2593         }
2594
2595         return BC_PARSE_STATUS_SUCCESS;
2596 }
2597
2598 /**
2599  * Parses an expression with bc_parse_expr_err(), but throws an error if it gets
2600  * an empty expression.
2601  * @param p      The parser.
2602  * @param flags  The flags for what is valid in the expression.
2603  * @param next   A set of tokens for what is valid *after* the expression.
2604  */
2605 static void
2606 bc_parse_expr_status(BcParse* p, uint8_t flags, BcParseNext next)
2607 {
2608         BcParseStatus s = bc_parse_expr_err(p, flags, next);
2609
2610         if (BC_ERR(s == BC_PARSE_STATUS_EMPTY_EXPR))
2611         {
2612                 bc_parse_err(p, BC_ERR_PARSE_EMPTY_EXPR);
2613         }
2614 }
2615
2616 void
2617 bc_parse_expr(BcParse* p, uint8_t flags)
2618 {
2619         assert(p);
2620         bc_parse_expr_status(p, flags, bc_parse_next_read);
2621 }
2622 #endif // BC_ENABLED