]> ocean-lang.org Git - ocean/blob - csrc/oceani.mdc
oceani: allow a type to control how it is printed.
[ocean] / csrc / oceani.mdc
1 # Ocean Interpreter - Stoney Creek version
2
3 Ocean is intended to be a compiled language, so this interpreter is
4 not targeted at being the final product.  It is, rather, an intermediate
5 stage and fills that role in two distinct ways.
6
7 Firstly, it exists as a platform to experiment with the early language
8 design.  An interpreter is easy to write and easy to get working, so
9 the barrier for entry is lower if I aim to start with an interpreter.
10
11 Secondly, the plan for the Ocean compiler is to write it in the
12 [Ocean language](http://ocean-lang.org).  To achieve this we naturally
13 need some sort of boot-strap process and this interpreter - written in
14 portable C - will fill that role.  It will be used to bootstrap the
15 Ocean compiler.
16
17 Two features that are not needed to fill either of these roles are
18 performance and completeness.  The interpreter only needs to be fast
19 enough to run small test programs and occasionally to run the compiler
20 on itself.  It only needs to be complete enough to test aspects of the
21 design which are developed before the compiler is working, and to run
22 the compiler on itself.  Any features not used by the compiler when
23 compiling itself are superfluous.  They may be included anyway, but
24 they may not.
25
26 Nonetheless, the interpreter should end up being reasonably complete,
27 and any performance bottlenecks which appear and are easily fixed, will
28 be.
29
30 ## Current version
31
32 This second version of the interpreter exists to test out the
33 structured statement providing conditions and iteration, and simple
34 variable scoping.  Clearly we need some minimal other functionality so
35 that values can be tested and instructions iterated over.  All that
36 functionality is clearly not normative at this stage (not that
37 anything is **really** normative yet) and will change, so early test
38 code will certainly break in later versions.
39
40 The under-test parts of the language are:
41
42  - conditional/looping structured statements
43  - the `use` statement which is needed for that
44  - Variable binding using ":=" and "::=", and assignment using "=".
45
46 Elements which are present to make a usable language are:
47
48  - "blocks" of multiple statements.
49  - `pass`: a statement which does nothing.
50  - expressions: `+`, `-`, `*`, `/` can apply to numbers and `++` can
51    catenate strings.  `and`, `or`, `not` manipulate Booleans, and
52    normal comparison operators can work on all three types.
53  - `print`: will print the values in a list of expressions.
54  - `program`: is given a list of identifiers to initialize from
55    arguments.
56
57 ## Naming
58
59 Versions of the interpreter which obviously do not support a complete
60 language will be named after creeks and streams.  This one is Stoney
61 Creek.
62
63 Once we have something reasonably resembling a complete language, the
64 names of rivers will be used.
65 Early versions of the compiler will be named after seas.  Major
66 releases of the compiler will be named after oceans.  Hopefully I will
67 be finished once I get to the Pacific Ocean release.
68
69 ## Outline
70
71 As well as parsing and executing a program, the interpreter can print
72 out the program from the parsed internal structure.  This is useful
73 for validating the parsing.
74 So the main requirements of the interpreter are:
75
76 - Parse the program, possibly with tracing,
77 - Analyse the parsed program to ensure consistency,
78 - Print the program,
79 - Execute the program.
80
81 This is all performed by a single C program extracted with
82 `parsergen`.
83
84 There will be two formats for printing the program: a default and one
85 that uses bracketing.  So a `--bracket` command line option is needed
86 for that.  Normally the first code section found is used, however an
87 alternate section can be requested so that a file (such as this one)
88 can contain multiple programs This is effected with the `--section`
89 option.
90
91 This code must be compiled with `-fplan9-extensions` so that anonymous
92 structures can be used.
93
94 ###### File: oceani.mk
95
96         myCFLAGS := -Wall -g -fplan9-extensions
97         CFLAGS := $(filter-out $(myCFLAGS),$(CFLAGS)) $(myCFLAGS)
98         myLDLIBS:= libparser.o libscanner.o libmdcode.o -licuuc
99         LDLIBS := $(filter-out $(myLDLIBS),$(LDLIBS)) $(myLDLIBS)
100         ## libs
101         all :: $(LDLIBS) oceani
102         oceani.c oceani.h : oceani.mdc parsergen
103                 ./parsergen -o oceani --LALR --tag Parser oceani.mdc
104         oceani.mk: oceani.mdc md2c
105                 ./md2c oceani.mdc
106
107         oceani: oceani.o $(LDLIBS)
108                 $(CC) $(CFLAGS) -o oceani oceani.o $(LDLIBS)
109
110 ###### Parser: header
111         ## macros
112         ## ast
113         struct parse_context {
114                 struct token_config config;
115                 char *file_name;
116                 int parse_error;
117                 ## parse context
118         };
119
120 ###### macros
121
122         #define container_of(ptr, type, member) ({                      \
123                 const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
124                 (type *)( (char *)__mptr - offsetof(type,member) );})
125
126         #define config2context(_conf) container_of(_conf, struct parse_context, \
127                 config)
128
129 ###### Parser: code
130
131         #include <unistd.h>
132         #include <stdlib.h>
133         #include <fcntl.h>
134         #include <errno.h>
135         #include <sys/mman.h>
136         #include <string.h>
137         #include <stdio.h>
138         #include <locale.h>
139         #include <malloc.h>
140         #include "mdcode.h"
141         #include "scanner.h"
142         #include "parser.h"
143
144         ## includes
145
146         #include "oceani.h"
147
148         ## forward decls
149         ## value functions
150         ## ast functions
151         ## core functions
152
153         #include <getopt.h>
154         static char Usage[] = "Usage: oceani --trace --print --noexec --brackets"
155                               "--section=SectionName prog.ocn\n";
156         static const struct option long_options[] = {
157                 {"trace",     0, NULL, 't'},
158                 {"print",     0, NULL, 'p'},
159                 {"noexec",    0, NULL, 'n'},
160                 {"brackets",  0, NULL, 'b'},
161                 {"section",   1, NULL, 's'},
162                 {NULL,        0, NULL, 0},
163         };
164         const char *options = "tpnbs";
165         int main(int argc, char *argv[])
166         {
167                 int fd;
168                 int len;
169                 char *file;
170                 struct section *s;
171                 char *section = NULL;
172                 struct parse_context context = {
173                         .config = {
174                                 .ignored = (1 << TK_line_comment)
175                                          | (1 << TK_block_comment),
176                                 .number_chars = ".,_+-",
177                                 .word_start = "_",
178                                 .word_cont = "_",
179                         },
180                 };
181                 int doprint=0, dotrace=0, doexec=1, brackets=0;
182                 struct exec **prog;
183                 int opt;
184                 while ((opt = getopt_long(argc, argv, options, long_options, NULL))
185                        != -1) {
186                         switch(opt) {
187                         case 't': dotrace=1; break;
188                         case 'p': doprint=1; break;
189                         case 'n': doexec=0; break;
190                         case 'b': brackets=1; break;
191                         case 's': section = optarg; break;
192                         default: fprintf(stderr, Usage);
193                                 exit(1);
194                         }
195                 }
196                 if (optind >= argc) {
197                         fprintf(stderr, "oceani: no input file given\n");
198                         exit(1);
199                 }
200                 fd = open(argv[optind], O_RDONLY);
201                 if (fd < 0) {
202                         fprintf(stderr, "oceani: cannot open %s\n", argv[optind]);
203                         exit(1);
204                 }
205                 context.file_name = argv[optind];
206                 len = lseek(fd, 0, 2);
207                 file = mmap(NULL, len, PROT_READ, MAP_SHARED, fd, 0);
208                 s = code_extract(file, file+len, NULL);
209                 if (!s) {
210                         fprintf(stderr, "oceani: could not find any code in %s\n",
211                                 argv[optind]);
212                         exit(1);
213                 }
214
215                 ## context initialization
216
217                 if (section) {
218                         struct section *ss;
219                         for (ss = s; ss; ss = ss->next) {
220                                 struct text sec = ss->section;
221                                 if (sec.len == strlen(section) &&
222                                     strncmp(sec.txt, section, sec.len) == 0)
223                                         break;
224                         }
225                         if (ss)
226                                 prog = parse_oceani(ss->code, &context.config,
227                                                     dotrace ? stderr : NULL);
228                         else {
229                                 fprintf(stderr, "oceani: cannot find section %s\n",
230                                         section);
231                                 exit(1);
232                         }
233                 } else
234                         prog = parse_oceani(s->code, &context.config,
235                                     dotrace ? stderr : NULL);
236                 if (!prog) {
237                         fprintf(stderr, "oceani: fatal parser error.\n");
238                         context.parse_error = 1;
239                 }
240                 if (prog && doprint)
241                         print_exec(*prog, 0, brackets);
242                 if (prog && doexec && !context.parse_error) {
243                         if (!analyse_prog(*prog, &context)) {
244                                 fprintf(stderr, "oceani: type error in program - not running.\n");
245                                 exit(1);
246                         }
247                         interp_prog(*prog, argv+optind+1);
248                 }
249                 if (prog) {
250                         free_exec(*prog);
251                         free(prog);
252                 }
253                 while (s) {
254                         struct section *t = s->next;
255                         code_free(s->code);
256                         free(s);
257                         s = t;
258                 }
259                 ## free context vars
260                 ## free context types
261                 exit(context.parse_error ? 1 : 0);
262         }
263
264 ### Analysis
265
266 The four requirements of parse, analyse, print, interpret apply to
267 each language element individually so that is how most of the code
268 will be structured.
269
270 Three of the four are fairly self explanatory.  The one that requires
271 a little explanation is the analysis step.
272
273 The current language design does not require the types of variables to
274 be declared, but they must still have a single type.  Different
275 operations impose different requirements on the variables, for example
276 addition requires both arguments to be numeric, and assignment
277 requires the variable on the left to have the same type as the
278 expression on the right.
279
280 Analysis involves propagating these type requirements around and
281 consequently setting the type of each variable.  If any requirements
282 are violated (e.g. a string is compared with a number) or if a
283 variable needs to have two different types, then an error is raised
284 and the program will not run.
285
286 If the same variable is declared in both branchs of an 'if/else', or
287 in all cases of a 'switch' then the multiple instances may be merged
288 into just one variable if the variable is references after the
289 conditional statement.  When this happens, the types must naturally be
290 consistent across all the branches.  When the variable is not used
291 outside the if, the variables in the different branches are distinct
292 and can be of different types.
293
294 Determining the types of all variables early is important for
295 processing command line arguments.  These can be assigned to any type
296 of variable, but we must first know the correct type so any required
297 conversion can happen.  If a variable is associated with a command
298 line argument but no type can be interpreted (e.g. the variable is
299 only ever used in a `print` statement), then the type is set to
300 'string'.
301
302 Undeclared names may only appear in "use" statements and "case" expressions.
303 These names are given a type of "label" and a unique value.
304 This allows them to fill the role of a name in an enumerated type, which
305 is useful for testing the `switch` statement.
306
307 As we will see, the condition part of a `while` statement can return
308 either a Boolean or some other type.  This requires that the expect
309 type that gets passed around comprises a type (`enum vtype`) and a
310 flag to indicate that `Vbool` is also permitted.
311
312 As there are, as yet, no distinct types that are compatible, there
313 isn't much subtlety in the analysis.  When we have distinct number
314 types, this will become more interesting.
315
316 #### Error reporting
317
318 When analysis discovers an inconsistency it needs to report an error;
319 just refusing to run the code ensures that the error doesn't cascade,
320 but by itself it isn't very useful.  A clear understand of the sort of
321 error message that are useful will help guide the process of analysis.
322
323 At a simplistic level, the only sort of error that type analysis can
324 report is that the type of some construct doesn't match a contextual
325 requirement.  For example, in `4 + "hello"` the addition provides a
326 contextual requirement for numbers, but `"hello"` is not a number.  In
327 this particular example no further information is needed as the types
328 are obvious from local information.  When a variable is involved that
329 isn't the case.  It may be helpful to explain why the variable has a
330 particular type, by indicating the location where the type was set,
331 whether by declaration or usage.
332
333 Using a recursive-descent analysis we can easily detect a problem at
334 multiple locations. In "`hello:= "there"; 4 + hello`" the addition
335 will detect that one argument is not a number and the usage of `hello`
336 will detect that a number was wanted, but not provided.  In this
337 (early) version of the language, we will generate error reports at
338 multiple locations, so the use of `hello` will report an error and
339 explain were the value was set, and the addition will report an error
340 and say why numbers are needed.  To be able to report locations for
341 errors, each language element will need to record a file location
342 (line and column) and each variable will need to record the language
343 element where its type was set.  For now we will assume that each line
344 of an error message indicates one location in the file, and up to 2
345 types.  So we provide a `printf`-like function which takes a format, a
346 language (a `struct exec` which has not yet been introduced), and 2
347 types. "`%1`" reports the first type, "`%2`" reports the second.  We
348 will need a function to print the location, once we know how that is
349 stored.  As will be explained later, there are sometimes extra rules for
350 type matching and they might affect error messages, we need to pass those
351 in too.
352
353 As well as type errors, we sometimes need to report problems with
354 tokens, which might be unexpected or might name a type that has not
355 been defined.  For these we have `tok_err()` which reports an error
356 with a given token.  Each of the error functions sets the flag in the
357 context so indicate that parsing failed.
358
359 ###### forward decls
360
361         static void fput_loc(struct exec *loc, FILE *f);
362
363 ###### core functions
364
365         static void type_err(struct parse_context *c,
366                              char *fmt, struct exec *loc,
367                              struct type *t1, int rules, struct type *t2)
368         {
369                 fprintf(stderr, "%s:", c->file_name);
370                 fput_loc(loc, stderr);
371                 for (; *fmt ; fmt++) {
372                         if (*fmt != '%') {
373                                 fputc(*fmt, stderr);
374                                 continue;
375                         }
376                         fmt++;
377                         switch (*fmt) {
378                         case '%': fputc(*fmt, stderr); break;
379                         default: fputc('?', stderr); break;
380                         case '1':
381                                 type_print(t1, stderr);
382                                 break;
383                         case '2':
384                                 type_print(t2, stderr);
385                                 break;
386                         ## format cases
387                         }
388                 }
389                 fputs("\n", stderr);
390                 c->parse_error = 1;
391         }
392
393         static void tok_err(struct parse_context *c, char *fmt, struct token *t)
394         {
395                 fprintf(stderr, "%s:%d:%d: %s: %.*s\n", c->file_name, t->line, t->col, fmt,
396                         t->txt.len, t->txt.txt);
397                 c->parse_error = 1;
398         }
399
400 ## Data Structures
401
402 One last introductory step before detailing the language elements and
403 providing their four requirements is to establish the data structures
404 to store these elements.
405
406 There are two key objects that we need to work with: executable
407 elements which comprise the program, and values which the program
408 works with.  Between these are the variables in their various scopes
409 which hold the values, and types which classify the values stored and
410 manipulatd by executables.
411
412 ### Types
413
414 Values come in a wide range of types, with more likely to be added.
415 Each type needs to be able to parse and print its own values (for
416 convenience at least) as well as to compare two values, at least for
417 equality and possibly for order.  For now, values might need to be
418 duplicated and freed, though eventually such manipulations will be
419 better integrated into the language.
420
421 Rather than requiring every numeric type to support all numeric
422 operations (add, multiple, etc), we allow types to be able to present
423 as one of a few standard types: integer, float, and fraction.  The
424 existance of these conversion functions enable types to determine if
425 they are compatible with other types.
426
427 Named type are stored in a simple linked list.  Objects of each type are "values"
428 which are often passed around by value.
429
430 ###### ast
431
432         struct value {
433                 struct type *type;
434                 union {
435                         ## value union fields
436                 };
437         };
438
439         struct type {
440                 struct text name;
441                 struct type *next;
442                 struct value (*init)(struct type *type);
443                 struct value (*prepare)(struct type *type);
444                 struct value (*parse)(struct type *type, char *str);
445                 void (*print)(struct value val);
446                 void (*print_type)(struct type *type, FILE *f);
447                 int (*cmp_order)(struct value v1, struct value v2);
448                 int (*cmp_eq)(struct value v1, struct value v2);
449                 struct value (*dup)(struct value val);
450                 void (*free)(struct value val);
451                 int (*compat)(struct type *this, struct type *other);
452                 long long (*to_int)(struct value *v);
453                 double (*to_float)(struct value *v);
454                 int (*to_mpq)(mpq_t *q, struct value *v);
455                 union {
456                         ## type union fields
457                 };
458         };
459
460 ###### parse context
461
462         struct type *typelist;
463
464 ###### ast functions
465
466         static struct type *find_type(struct parse_context *c, struct text s)
467         {
468                 struct type *l = c->typelist;
469
470                 while (l &&
471                        text_cmp(l->name, s) != 0)
472                                 l = l->next;
473                 return l;
474         }
475
476         static struct type *add_type(struct parse_context *c, struct text s,
477                                      struct type *proto)
478         {
479                 struct type *n;
480
481                 n = calloc(1, sizeof(*n));
482                 *n = *proto;
483                 n->name = s;
484                 n->next = c->typelist;
485                 c->typelist = n;
486                 return n;
487         }
488
489         static void free_type(struct type *t)
490         {
491                 /* The type is always a reference to something in the
492                  * context, so we don't need to free anything.
493                  */
494         }
495
496         static void free_value(struct value v)
497         {
498                 if (v.type)
499                         v.type->free(v);
500         }
501
502         static int type_compat(struct type *require, struct type *have, int rules)
503         {
504                 if ((rules & Rboolok) && have == Tbool)
505                         return 1;
506                 if ((rules & Rnolabel) && have == Tlabel)
507                         return 0;
508                 if (!require || !have)
509                         return 1;
510
511                 if (require->compat)
512                         return require->compat(require, have);
513
514                 return require == have;
515         }
516
517         static void type_print(struct type *type, FILE *f)
518         {
519                 if (!type)
520                         fputs("*unknown*type*", f);
521                 else if (type->name.len)
522                         fprintf(f, "%.*s", type->name.len, type->name.txt);
523                 else if (type->print_type)
524                         type->print_type(type, f);
525                 else
526                         fputs("*invalid*type*", f);
527         }
528
529         static struct value val_prepare(struct type *type)
530         {
531                 struct value rv;
532
533                 if (type)
534                         return type->prepare(type);
535                 rv.type = type;
536                 return rv;
537         }
538
539         static struct value val_init(struct type *type)
540         {
541                 struct value rv;
542
543                 if (type)
544                         return type->init(type);
545                 rv.type = type;
546                 return rv;
547         }
548
549         static struct value dup_value(struct value v)
550         {
551                 if (v.type)
552                         return v.type->dup(v);
553                 return v;
554         }
555
556         static int value_cmp(struct value left, struct value right)
557         {
558                 if (left.type && left.type->cmp_order)
559                         return left.type->cmp_order(left, right);
560                 if (left.type && left.type->cmp_eq)
561                         return left.type->cmp_eq(left, right);
562                 return -1;
563         }
564
565         static void print_value(struct value v)
566         {
567                 if (v.type && v.type->print)
568                         v.type->print(v);
569                 else
570                         printf("*Unknown*");
571         }
572
573         static struct value parse_value(struct type *type, char *arg)
574         {
575                 struct value rv;
576
577                 if (type && type->parse)
578                         return type->parse(type, arg);
579                 rv.type = NULL;
580                 return rv;
581         }
582
583 ###### free context types
584
585         while (context.typelist) {
586                 struct type *t = context.typelist;
587
588                 context.typelist = t->next;
589                 free(t);
590         }
591
592 #### Base Types
593
594 Values of the base types can be numbers, which we represent as
595 multi-precision fractions, strings, Booleans and labels.  When
596 analysing the program we also need to allow for places where no value
597 is meaningful (type `Tnone`) and where we don't know what type to
598 expect yet (type is `NULL`).
599
600 Values are never shared, they are always copied when used, and freed
601 when no longer needed.
602
603 When propagating type information around the program, we need to
604 determine if two types are compatible, where type `NULL` is compatible
605 with anything.  There are two special cases with type compatibility,
606 both related to the Conditional Statement which will be described
607 later.  In some cases a Boolean can be accepted as well as some other
608 primary type, and in others any type is acceptable except a label (`Vlabel`).
609 A separate function encode these cases will simplify some code later.
610
611 When assigning command line arguments to variables, we need to be able
612 to parse each type from a string.
613
614 ###### includes
615         #include <gmp.h>
616         #include "string.h"
617         #include "number.h"
618
619 ###### libs
620         myLDLIBS := libnumber.o libstring.o -lgmp
621         LDLIBS := $(filter-out $(myLDLIBS),$(LDLIBS)) $(myLDLIBS)
622
623 ###### type union fields
624         enum vtype {Vnone, Vstr, Vnum, Vbool, Vlabel} vtype;
625
626 ###### value union fields
627         struct text str;
628         mpq_t num;
629         int bool;
630         void *label;
631
632 ###### ast functions
633         static void _free_value(struct value v)
634         {
635                 switch (v.type->vtype) {
636                 case Vnone: break;
637                 case Vstr: free(v.str.txt); break;
638                 case Vnum: mpq_clear(v.num); break;
639                 case Vlabel:
640                 case Vbool: break;
641                 }
642         }
643
644 ###### value functions
645
646         static struct value _val_prepare(struct type *type)
647         {
648                 struct value rv;
649
650                 rv.type = type;
651                 switch(type->vtype) {
652                 case Vnone:
653                         break;
654                 case Vnum:
655                         memset(&rv.num, 0, sizeof(rv.num));
656                         break;
657                 case Vstr:
658                         rv.str.txt = NULL;
659                         rv.str.len = 0;
660                         break;
661                 case Vbool:
662                         rv.bool = 0;
663                         break;
664                 case Vlabel:
665                         rv.label = NULL;
666                         break;
667                 }
668                 return rv;
669         }
670
671         static struct value _val_init(struct type *type)
672         {
673                 struct value rv;
674
675                 rv.type = type;
676                 switch(type->vtype) {
677                 case Vnone:
678                         break;
679                 case Vnum:
680                         mpq_init(rv.num); break;
681                 case Vstr:
682                         rv.str.txt = malloc(1);
683                         rv.str.len = 0;
684                         break;
685                 case Vbool:
686                         rv.bool = 0;
687                         break;
688                 case Vlabel:
689                         rv.label = NULL;
690                         break;
691                 }
692                 return rv;
693         }
694
695         static struct value _dup_value(struct value v)
696         {
697                 struct value rv;
698                 rv.type = v.type;
699                 switch (rv.type->vtype) {
700                 case Vnone:
701                         break;
702                 case Vlabel:
703                         rv.label = v.label;
704                         break;
705                 case Vbool:
706                         rv.bool = v.bool;
707                         break;
708                 case Vnum:
709                         mpq_init(rv.num);
710                         mpq_set(rv.num, v.num);
711                         break;
712                 case Vstr:
713                         rv.str.len = v.str.len;
714                         rv.str.txt = malloc(rv.str.len);
715                         memcpy(rv.str.txt, v.str.txt, v.str.len);
716                         break;
717                 }
718                 return rv;
719         }
720
721         static int _value_cmp(struct value left, struct value right)
722         {
723                 int cmp;
724                 if (left.type != right.type)
725                         return left.type - right.type;
726                 switch (left.type->vtype) {
727                 case Vlabel: cmp = left.label == right.label ? 0 : 1; break;
728                 case Vnum: cmp = mpq_cmp(left.num, right.num); break;
729                 case Vstr: cmp = text_cmp(left.str, right.str); break;
730                 case Vbool: cmp = left.bool - right.bool; break;
731                 case Vnone: cmp = 0;
732                 }
733                 return cmp;
734         }
735
736         static void _print_value(struct value v)
737         {
738                 switch (v.type->vtype) {
739                 case Vnone:
740                         printf("*no-value*"); break;
741                 case Vlabel:
742                         printf("*label-%p*", v.label); break;
743                 case Vstr:
744                         printf("%.*s", v.str.len, v.str.txt); break;
745                 case Vbool:
746                         printf("%s", v.bool ? "True":"False"); break;
747                 case Vnum:
748                         {
749                         mpf_t fl;
750                         mpf_init2(fl, 20);
751                         mpf_set_q(fl, v.num);
752                         gmp_printf("%Fg", fl);
753                         mpf_clear(fl);
754                         break;
755                         }
756                 }
757         }
758
759         static struct value _parse_value(struct type *type, char *arg)
760         {
761                 struct value val;
762                 struct text tx;
763                 int neg = 0;
764                 char tail[3] = "";
765
766                 val.type = type;
767                 switch(type->vtype) {
768                 case Vlabel:
769                 case Vnone:
770                         val.type = NULL;
771                         break;
772                 case Vstr:
773                         val.str.len = strlen(arg);
774                         val.str.txt = malloc(val.str.len);
775                         memcpy(val.str.txt, arg, val.str.len);
776                         break;
777                 case Vnum:
778                         if (*arg == '-') {
779                                 neg = 1;
780                                 arg++;
781                         }
782                         tx.txt = arg; tx.len = strlen(tx.txt);
783                         if (number_parse(val.num, tail, tx) == 0)
784                                 mpq_init(val.num);
785                         else if (neg)
786                                 mpq_neg(val.num, val.num);
787                         if (tail[0]) {
788                                 printf("Unsupported suffix: %s\n", arg);
789                                 val.type = NULL;
790                         }
791                         break;
792                 case Vbool:
793                         if (strcasecmp(arg, "true") == 0 ||
794                             strcmp(arg, "1") == 0)
795                                 val.bool = 1;
796                         else if (strcasecmp(arg, "false") == 0 ||
797                                  strcmp(arg, "0") == 0)
798                                 val.bool = 0;
799                         else {
800                                 printf("Bad bool: %s\n", arg);
801                                 val.type = NULL;
802                         }
803                         break;
804                 }
805                 return val;
806         }
807
808         static void _free_value(struct value v);
809
810         static struct type base_prototype = {
811                 .init = _val_init,
812                 .prepare = _val_prepare,
813                 .parse = _parse_value,
814                 .print = _print_value,
815                 .cmp_order = _value_cmp,
816                 .cmp_eq = _value_cmp,
817                 .dup = _dup_value,
818                 .free = _free_value,
819         };
820
821         static struct type *Tbool, *Tstr, *Tnum, *Tnone, *Tlabel;
822
823 ###### ast functions
824         static struct type *add_base_type(struct parse_context *c, char *n, enum vtype vt)
825         {
826                 struct text txt = { n, strlen(n) };
827                 struct type *t;
828
829                 t = add_type(c, txt, &base_prototype);
830                 t->vtype = vt;
831                 return t;
832         }
833
834 ###### context initialization
835
836         Tbool  = add_base_type(&context, "Boolean", Vbool);
837         Tstr   = add_base_type(&context, "string", Vstr);
838         Tnum   = add_base_type(&context, "number", Vnum);
839         Tnone  = add_base_type(&context, "none", Vnone);
840         Tlabel = add_base_type(&context, "label", Vlabel);
841
842 ### Variables
843
844 Variables are scoped named values.  We store the names in a linked
845 list of "bindings" sorted lexically, and use sequential search and
846 insertion sort.
847
848 ###### ast
849
850         struct binding {
851                 struct text name;
852                 struct binding *next;   // in lexical order
853                 ## binding fields
854         };
855
856 This linked list is stored in the parse context so that "reduce"
857 functions can find or add variables, and so the analysis phase can
858 ensure that every variable gets a type.
859
860 ###### parse context
861
862         struct binding *varlist;  // In lexical order
863
864 ###### ast functions
865
866         static struct binding *find_binding(struct parse_context *c, struct text s)
867         {
868                 struct binding **l = &c->varlist;
869                 struct binding *n;
870                 int cmp = 1;
871
872                 while (*l &&
873                         (cmp = text_cmp((*l)->name, s)) < 0)
874                                 l = & (*l)->next;
875                 if (cmp == 0)
876                         return *l;
877                 n = calloc(1, sizeof(*n));
878                 n->name = s;
879                 n->next = *l;
880                 *l = n;
881                 return n;
882         }
883
884 Each name can be linked to multiple variables defined in different
885 scopes.  Each scope starts where the name is declared and continues
886 until the end of the containing code block.  Scopes of a given name
887 cannot nest, so a declaration while a name is in-scope is an error.
888
889 ###### binding fields
890         struct variable *var;
891
892 ###### ast
893         struct variable {
894                 struct variable *previous;
895                 struct value val;
896                 struct binding *name;
897                 struct exec *where_decl;// where name was declared
898                 struct exec *where_set; // where type was set
899                 ## variable fields
900         };
901
902 While the naming seems strange, we include local constants in the
903 definition of variables.  A name declared `var := value` can
904 subsequently be changed, but a name declared `var ::= value` cannot -
905 it is constant
906
907 ###### variable fields
908         int constant;
909
910 Scopes in parallel branches can be partially merged.  More
911 specifically, if a given name is declared in both branches of an
912 if/else then its scope is a candidate for merging.  Similarly if
913 every branch of an exhaustive switch (e.g. has an "else" clause)
914 declares a given name, then the scopes from the branches are
915 candidates for merging.
916
917 Note that names declared inside a loop (which is only parallel to
918 itself) are never visible after the loop.  Similarly names defined in
919 scopes which are not parallel, such as those started by `for` and
920 `switch`, are never visible after the scope.  Only variables defined in
921 both `then` and `else` (including the implicit then after an `if`, and
922 excluding `then` used with `for`) and in all `case`s and `else` of a
923 `switch` or `while` can be visible beyond the `if`/`switch`/`while`.
924
925 Labels, which are a bit like variables, follow different rules.
926 Labels are not explicitly declared, but if an undeclared name appears
927 in a context where a label is legal, that effectively declares the
928 name as a label.  The declaration remains in force (or in scope) at
929 least to the end of the immediately containing block and conditionally
930 in any larger containing block which does not declare the name in some
931 other way.  Importantly, the conditional scope extension happens even
932 if the label is only used in one parallel branch of a conditional --
933 when used in one branch it is treated as having been declared in all
934 branches.
935
936 Merge candidates are tentatively visible beyond the end of the
937 branching statement which creates them.  If the name is used, the
938 merge is affirmed and they become a single variable visible at the
939 outer layer.  If not - if it is redeclared first - the merge lapses.
940
941 To track scopes we have an extra stack, implemented as a linked list,
942 which roughly parallels the parse stack and which is used exclusively
943 for scoping.  When a new scope is opened, a new frame is pushed and
944 the child-count of the parent frame is incremented.  This child-count
945 is used to distinguish between the first of a set of parallel scopes,
946 in which declared variables must not be in scope, and subsequent
947 branches, whether they must already be conditionally scoped.
948
949 To push a new frame *before* any code in the frame is parsed, we need a
950 grammar reduction.  This is most easily achieved with a grammar
951 element which derives the empty string, and creates the new scope when
952 it is recognized.  This can be placed, for example, between a keyword
953 like "if" and the code following it.
954
955 ###### ast
956         struct scope {
957                 struct scope *parent;
958                 int child_count;
959         };
960
961 ###### parse context
962         int scope_depth;
963         struct scope *scope_stack;
964
965 ###### ast functions
966         static void scope_pop(struct parse_context *c)
967         {
968                 struct scope *s = c->scope_stack;
969
970                 c->scope_stack = s->parent;
971                 free(s);
972                 c->scope_depth -= 1;
973         }
974
975         static void scope_push(struct parse_context *c)
976         {
977                 struct scope *s = calloc(1, sizeof(*s));
978                 if (c->scope_stack)
979                         c->scope_stack->child_count += 1;
980                 s->parent = c->scope_stack;
981                 c->scope_stack = s;
982                 c->scope_depth += 1;
983         }
984
985 ###### Grammar
986
987         $void
988         OpenScope -> ${ scope_push(config2context(config)); }$
989
990
991 Each variable records a scope depth and is in one of four states:
992
993 - "in scope".  This is the case between the declaration of the
994   variable and the end of the containing block, and also between
995   the usage with affirms a merge and the end of that block.
996
997   The scope depth is not greater than the current parse context scope
998   nest depth.  When the block of that depth closes, the state will
999   change.  To achieve this, all "in scope" variables are linked
1000   together as a stack in nesting order.
1001
1002 - "pending".  The "in scope" block has closed, but other parallel
1003   scopes are still being processed.  So far, every parallel block at
1004   the same level that has closed has declared the name.
1005
1006   The scope depth is the depth of the last parallel block that
1007   enclosed the declaration, and that has closed.
1008
1009 - "conditionally in scope".  The "in scope" block and all parallel
1010   scopes have closed, and no further mention of the name has been
1011   seen.  This state includes a secondary nest depth which records the
1012   outermost scope seen since the variable became conditionally in
1013   scope.  If a use of the name is found, the variable becomes "in
1014   scope" and that secondary depth becomes the recorded scope depth.
1015   If the name is declared as a new variable, the old variable becomes
1016   "out of scope" and the recorded scope depth stays unchanged.
1017
1018 - "out of scope".  The variable is neither in scope nor conditionally
1019   in scope.  It is permanently out of scope now and can be removed from
1020   the "in scope" stack.
1021
1022
1023 ###### variable fields
1024         int depth, min_depth;
1025         enum { OutScope, PendingScope, CondScope, InScope } scope;
1026         struct variable *in_scope;
1027
1028 ###### parse context
1029
1030         struct variable *in_scope;
1031
1032 All variables with the same name are linked together using the
1033 'previous' link.  Those variable that have
1034 been affirmatively merged all have a 'merged' pointer that points to
1035 one primary variable - the most recently declared instance. When
1036 merging variables, we need to also adjust the 'merged' pointer on any
1037 other variables that had previously been merged with the one that will
1038 no longer be primary.
1039
1040 ###### variable fields
1041         struct variable *merged;
1042
1043 ###### ast functions
1044
1045         static void variable_merge(struct variable *primary, struct variable *secondary)
1046         {
1047                 struct variable *v;
1048
1049                 if (primary->merged)
1050                         // shouldn't happen
1051                         primary = primary->merged;
1052
1053                 for (v = primary->previous; v; v=v->previous)
1054                         if (v == secondary || v == secondary->merged ||
1055                             v->merged == secondary ||
1056                             (v->merged && v->merged == secondary->merged)) {
1057                                 v->scope = OutScope;
1058                                 v->merged = primary;
1059                         }
1060         }
1061
1062 ###### free context vars
1063
1064         while (context.varlist) {
1065                 struct binding *b = context.varlist;
1066                 struct variable *v = b->var;
1067                 context.varlist = b->next;
1068                 free(b);
1069                 while (v) {
1070                         struct variable *t = v;
1071
1072                         v = t->previous;
1073                         free_value(t->val);
1074                         free(t);
1075                 }
1076         }
1077
1078 #### Manipulating Bindings
1079
1080 When a name is conditionally visible, a new declaration discards the
1081 old binding - the condition lapses.  Conversely a usage of the name
1082 affirms the visibility and extends it to the end of the containing
1083 block - i.e. the block that contains both the original declaration and
1084 the latest usage.  This is determined from `min_depth`.  When a
1085 conditionally visible variable gets affirmed like this, it is also
1086 merged with other conditionally visible variables with the same name.
1087
1088 When we parse a variable declaration we either signal an error if the
1089 name is currently bound, or create a new variable at the current nest
1090 depth if the name is unbound or bound to a conditionally scoped or
1091 pending-scope variable.  If the previous variable was conditionally
1092 scoped, it and its homonyms becomes out-of-scope.
1093
1094 When we parse a variable reference (including non-declarative
1095 assignment) we signal an error if the name is not bound or is bound to
1096 a pending-scope variable; update the scope if the name is bound to a
1097 conditionally scoped variable; or just proceed normally if the named
1098 variable is in scope.
1099
1100 When we exit a scope, any variables bound at this level are either
1101 marked out of scope or pending-scoped, depending on whether the
1102 scope was sequential or parallel.
1103
1104 When exiting a parallel scope we check if there are any variables that
1105 were previously pending and are still visible. If there are, then
1106 there weren't redeclared in the most recent scope, so they cannot be
1107 merged and must become out-of-scope.  If it is not the first of
1108 parallel scopes (based on `child_count`), we check that there was a
1109 previous binding that is still pending-scope.  If there isn't, the new
1110 variable must now be out-of-scope.
1111
1112 When exiting a sequential scope that immediately enclosed parallel
1113 scopes, we need to resolve any pending-scope variables.  If there was
1114 no `else` clause, and we cannot determine that the `switch` was exhaustive,
1115 we need to mark all pending-scope variable as out-of-scope.  Otherwise
1116 all pending-scope variables become conditionally scoped.
1117
1118 ###### ast
1119         enum closetype { CloseSequential, CloseParallel, CloseElse };
1120
1121 ###### ast functions
1122
1123         static struct variable *var_decl(struct parse_context *c, struct text s)
1124         {
1125                 struct binding *b = find_binding(c, s);
1126                 struct variable *v = b->var;
1127
1128                 switch (v ? v->scope : OutScope) {
1129                 case InScope:
1130                         /* Caller will report the error */
1131                         return NULL;
1132                 case CondScope:
1133                         for (;
1134                              v && v->scope == CondScope;
1135                              v = v->previous)
1136                                 v->scope = OutScope;
1137                         break;
1138                 default: break;
1139                 }
1140                 v = calloc(1, sizeof(*v));
1141                 v->previous = b->var;
1142                 b->var = v;
1143                 v->name = b;
1144                 v->min_depth = v->depth = c->scope_depth;
1145                 v->scope = InScope;
1146                 v->in_scope = c->in_scope;
1147                 c->in_scope = v;
1148                 v->val = val_prepare(NULL);
1149                 return v;
1150         }
1151
1152         static struct variable *var_ref(struct parse_context *c, struct text s)
1153         {
1154                 struct binding *b = find_binding(c, s);
1155                 struct variable *v = b->var;
1156                 struct variable *v2;
1157
1158                 switch (v ? v->scope : OutScope) {
1159                 case OutScope:
1160                 case PendingScope:
1161                         /* Signal an error - once that is possible */
1162                         return NULL;
1163                 case CondScope:
1164                         /* All CondScope variables of this name need to be merged
1165                          * and become InScope
1166                          */
1167                         v->depth = v->min_depth;
1168                         v->scope = InScope;
1169                         for (v2 = v->previous;
1170                              v2 && v2->scope == CondScope;
1171                              v2 = v2->previous)
1172                                 variable_merge(v, v2);
1173                         break;
1174                 case InScope:
1175                         break;
1176                 }
1177                 return v;
1178         }
1179
1180         static void var_block_close(struct parse_context *c, enum closetype ct)
1181         {
1182                 /* close of all variables that are in_scope */
1183                 struct variable *v, **vp, *v2;
1184
1185                 scope_pop(c);
1186                 for (vp = &c->in_scope;
1187                      v = *vp, v && v->depth > c->scope_depth && v->min_depth > c->scope_depth;
1188                      ) {
1189                         switch (ct) {
1190                         case CloseElse:
1191                         case CloseParallel: /* handle PendingScope */
1192                                 switch(v->scope) {
1193                                 case InScope:
1194                                 case CondScope:
1195                                         if (c->scope_stack->child_count == 1)
1196                                                 v->scope = PendingScope;
1197                                         else if (v->previous &&
1198                                                  v->previous->scope == PendingScope)
1199                                                 v->scope = PendingScope;
1200                                         else if (v->val.type == Tlabel)
1201                                                 v->scope = PendingScope;
1202                                         else if (v->name->var == v)
1203                                                 v->scope = OutScope;
1204                                         if (ct == CloseElse) {
1205                                                 /* All Pending variables with this name
1206                                                  * are now Conditional */
1207                                                 for (v2 = v;
1208                                                      v2 && v2->scope == PendingScope;
1209                                                      v2 = v2->previous)
1210                                                         v2->scope = CondScope;
1211                                         }
1212                                         break;
1213                                 case PendingScope:
1214                                         for (v2 = v;
1215                                              v2 && v2->scope == PendingScope;
1216                                              v2 = v2->previous)
1217                                                 if (v2->val.type != Tlabel)
1218                                                         v2->scope = OutScope;
1219                                         break;
1220                                 case OutScope: break;
1221                                 }
1222                                 break;
1223                         case CloseSequential:
1224                                 if (v->val.type == Tlabel)
1225                                         v->scope = PendingScope;
1226                                 switch (v->scope) {
1227                                 case InScope:
1228                                         v->scope = OutScope;
1229                                         break;
1230                                 case PendingScope:
1231                                         /* There was no 'else', so we can only become
1232                                          * conditional if we know the cases were exhaustive,
1233                                          * and that doesn't mean anything yet.
1234                                          * So only labels become conditional..
1235                                          */
1236                                         for (v2 = v;
1237                                              v2 && v2->scope == PendingScope;
1238                                              v2 = v2->previous)
1239                                                 if (v2->val.type == Tlabel) {
1240                                                         v2->scope = CondScope;
1241                                                         v2->min_depth = c->scope_depth;
1242                                                 } else
1243                                                         v2->scope = OutScope;
1244                                         break;
1245                                 case CondScope:
1246                                 case OutScope: break;
1247                                 }
1248                                 break;
1249                         }
1250                         if (v->scope == OutScope)
1251                                 *vp = v->in_scope;
1252                         else
1253                                 vp = &v->in_scope;
1254                 }
1255         }
1256
1257 ### Executables
1258
1259 Executables can be lots of different things.  In many cases an
1260 executable is just an operation combined with one or two other
1261 executables.  This allows for expressions and lists etc.  Other times
1262 an executable is something quite specific like a constant or variable
1263 name.  So we define a `struct exec` to be a general executable with a
1264 type, and a `struct binode` which is a subclass of `exec`, forms a
1265 node in a binary tree, and holds an operation. There will be other
1266 subclasses, and to access these we need to be able to `cast` the
1267 `exec` into the various other types.
1268
1269 ###### macros
1270         #define cast(structname, pointer) ({            \
1271                 const typeof( ((struct structname *)0)->type) *__mptr = &(pointer)->type; \
1272                 if (__mptr && *__mptr != X##structname) abort();                \
1273                 (struct structname *)( (char *)__mptr);})
1274
1275         #define new(structname) ({                                              \
1276                 struct structname *__ptr = ((struct structname *)calloc(1,sizeof(struct structname))); \
1277                 __ptr->type = X##structname;                                            \
1278                 __ptr->line = -1; __ptr->column = -1;                                   \
1279                 __ptr;})
1280
1281         #define new_pos(structname, token) ({                                           \
1282                 struct structname *__ptr = ((struct structname *)calloc(1,sizeof(struct structname))); \
1283                 __ptr->type = X##structname;                                            \
1284                 __ptr->line = token.line; __ptr->column = token.col;                    \
1285                 __ptr;})
1286
1287 ###### ast
1288         enum exec_types {
1289                 Xbinode,
1290                 ## exec type
1291         };
1292         struct exec {
1293                 enum exec_types type;
1294                 int line, column;
1295         };
1296         struct binode {
1297                 struct exec;
1298                 enum Btype {
1299                         ## Binode types
1300                 } op;
1301                 struct exec *left, *right;
1302         };
1303
1304 ###### ast functions
1305
1306         static int __fput_loc(struct exec *loc, FILE *f)
1307         {
1308                 if (loc->line >= 0) {
1309                         fprintf(f, "%d:%d: ", loc->line, loc->column);
1310                         return 1;
1311                 }
1312                 if (loc->type == Xbinode)
1313                         return __fput_loc(cast(binode,loc)->left, f) ||
1314                                __fput_loc(cast(binode,loc)->right, f);
1315                 return 0;
1316         }
1317         static void fput_loc(struct exec *loc, FILE *f)
1318         {
1319                 if (!__fput_loc(loc, f))
1320                         fprintf(f, "??:??: ");
1321         }
1322
1323 Each different type of `exec` node needs a number of functions
1324 defined, a bit like methods.  We must be able to be able to free it,
1325 print it, analyse it and execute it.  Once we have specific `exec`
1326 types we will need to parse them too.  Let's take this a bit more
1327 slowly.
1328
1329 #### Freeing
1330
1331 The parser generator requires a `free_foo` function for each struct
1332 that stores attributes and they will be `exec`s and subtypes there-of.
1333 So we need `free_exec` which can handle all the subtypes, and we need
1334 `free_binode`.
1335
1336 ###### ast functions
1337
1338         static void free_binode(struct binode *b)
1339         {
1340                 if (!b)
1341                         return;
1342                 free_exec(b->left);
1343                 free_exec(b->right);
1344                 free(b);
1345         }
1346
1347 ###### core functions
1348         static void free_exec(struct exec *e)
1349         {
1350                 if (!e)
1351                         return;
1352                 switch(e->type) {
1353                         ## free exec cases
1354                 }
1355         }
1356
1357 ###### forward decls
1358
1359         static void free_exec(struct exec *e);
1360
1361 ###### free exec cases
1362         case Xbinode: free_binode(cast(binode, e)); break;
1363
1364 #### Printing
1365
1366 Printing an `exec` requires that we know the current indent level for
1367 printing line-oriented components.  As will become clear later, we
1368 also want to know what sort of bracketing to use.
1369
1370 ###### ast functions
1371
1372         static void do_indent(int i, char *str)
1373         {
1374                 while (i--)
1375                         printf("    ");
1376                 printf("%s", str);
1377         }
1378
1379 ###### core functions
1380         static void print_binode(struct binode *b, int indent, int bracket)
1381         {
1382                 struct binode *b2;
1383                 switch(b->op) {
1384                 ## print binode cases
1385                 }
1386         }
1387
1388         static void print_exec(struct exec *e, int indent, int bracket)
1389         {
1390                 if (!e)
1391                         return;
1392                 switch (e->type) {
1393                 case Xbinode:
1394                         print_binode(cast(binode, e), indent, bracket); break;
1395                 ## print exec cases
1396                 }
1397         }
1398
1399 ###### forward decls
1400
1401         static void print_exec(struct exec *e, int indent, int bracket);
1402
1403 #### Analysing
1404
1405 As discussed, analysis involves propagating type requirements around
1406 the program and looking for errors.
1407
1408 So `propagate_types` is passed an expected type (being a `struct type`
1409 pointer together with some `val_rules` flags) that the `exec` is
1410 expected to return, and returns the type that it does return, either
1411 of which can be `NULL` signifying "unknown".  An `ok` flag is passed
1412 by reference. It is set to `0` when an error is found, and `2` when
1413 any change is made.  If it remains unchanged at `1`, then no more
1414 propagation is needed.
1415
1416 ###### ast
1417
1418         enum val_rules {Rnolabel = 1<<0, Rboolok = 1<<1};
1419
1420 ###### format cases
1421         case 'r':
1422                 if (rules & Rnolabel)
1423                         fputs(" (labels not permitted)", stderr);
1424                 break;
1425
1426 ###### core functions
1427
1428         static struct type *propagate_types(struct exec *prog, struct parse_context *c, int *ok,
1429                                             struct type *type, int rules)
1430         {
1431                 struct type *t;
1432
1433                 if (!prog)
1434                         return Tnone;
1435
1436                 switch (prog->type) {
1437                 case Xbinode:
1438                 {
1439                         struct binode *b = cast(binode, prog);
1440                         switch (b->op) {
1441                         ## propagate binode cases
1442                         }
1443                         break;
1444                 }
1445                 ## propagate exec cases
1446                 }
1447                 return Tnone;
1448         }
1449
1450 #### Interpreting
1451
1452 Interpreting an `exec` doesn't require anything but the `exec`.  State
1453 is stored in variables and each variable will be directly linked from
1454 within the `exec` tree.  The exception to this is the whole `program`
1455 which needs to look at command line arguments.  The `program` will be
1456 interpreted separately.
1457
1458 Each `exec` can return a value, which may be `Tnone` but must be non-NULL;
1459
1460 ###### core functions
1461
1462         static struct value interp_exec(struct exec *e)
1463         {
1464                 struct value rv;
1465                 rv.type = Tnone;
1466                 if (!e)
1467                         return rv;
1468
1469                 switch(e->type) {
1470                 case Xbinode:
1471                 {
1472                         struct binode *b = cast(binode, e);
1473                         struct value left, right;
1474                         left.type = right.type = Tnone;
1475                         switch (b->op) {
1476                         ## interp binode cases
1477                         }
1478                         free_value(left); free_value(right);
1479                         break;
1480                 }
1481                 ## interp exec cases
1482                 }
1483                 return rv;
1484         }
1485
1486 ## Language elements
1487
1488 Each language element needs to be parsed, printed, analysed,
1489 interpreted, and freed.  There are several, so let's just start with
1490 the easy ones and work our way up.
1491
1492 ### Values
1493
1494 We have already met values as separate objects.  When manifest
1495 constants appear in the program text, that must result in an executable
1496 which has a constant value.  So the `val` structure embeds a value in
1497 an executable.
1498
1499 ###### exec type
1500         Xval,
1501
1502 ###### ast
1503         struct val {
1504                 struct exec;
1505                 struct value val;
1506         };
1507
1508 ###### Grammar
1509
1510         $*val
1511         Value ->  True ${
1512                         $0 = new_pos(val, $1);
1513                         $0->val.type = Tbool;
1514                         $0->val.bool = 1;
1515                         }$
1516                 | False ${
1517                         $0 = new_pos(val, $1);
1518                         $0->val.type = Tbool;
1519                         $0->val.bool = 0;
1520                         }$
1521                 | NUMBER ${
1522                         $0 = new_pos(val, $1);
1523                         $0->val.type = Tnum;
1524                         {
1525                         char tail[3];
1526                         if (number_parse($0->val.num, tail, $1.txt) == 0)
1527                                 mpq_init($0->val.num);
1528                                 if (tail[0])
1529                                         tok_err(config2context(config), "error: unsupported number suffix",
1530                                                 &$1);
1531                         }
1532                         }$
1533                 | STRING ${
1534                         $0 = new_pos(val, $1);
1535                         $0->val.type = Tstr;
1536                         {
1537                         char tail[3];
1538                         string_parse(&$1, '\\', &$0->val.str, tail);
1539                         if (tail[0])
1540                                 tok_err(config2context(config), "error: unsupported string suffix",
1541                                         &$1);
1542                         }
1543                         }$
1544                 | MULTI_STRING ${
1545                         $0 = new_pos(val, $1);
1546                         $0->val.type = Tstr;
1547                         {
1548                         char tail[3];
1549                         string_parse(&$1, '\\', &$0->val.str, tail);
1550                         if (tail[0])
1551                                 tok_err(config2context(config), "error: unsupported string suffix",
1552                                         &$1);
1553                         }
1554                         }$
1555
1556 ###### print exec cases
1557         case Xval:
1558         {
1559                 struct val *v = cast(val, e);
1560                 if (v->val.type == Tstr)
1561                         printf("\"");
1562                 print_value(v->val);
1563                 if (v->val.type == Tstr)
1564                         printf("\"");
1565                 break;
1566         }
1567
1568 ###### propagate exec cases
1569                 case Xval:
1570                 {
1571                         struct val *val = cast(val, prog);
1572                         if (!type_compat(type, val->val.type, rules)) {
1573                                 type_err(c, "error: expected %1%r found %2",
1574                                            prog, type, rules, val->val.type);
1575                                 *ok = 0;
1576                         }
1577                         return val->val.type;
1578                 }
1579
1580 ###### interp exec cases
1581         case Xval:
1582                 return dup_value(cast(val, e)->val);
1583
1584 ###### ast functions
1585         static void free_val(struct val *v)
1586         {
1587                 if (!v)
1588                         return;
1589                 free_value(v->val);
1590                 free(v);
1591         }
1592
1593 ###### free exec cases
1594         case Xval: free_val(cast(val, e)); break;
1595
1596 ###### ast functions
1597         // Move all nodes from 'b' to 'rv', reversing the order.
1598         // In 'b' 'left' is a list, and 'right' is the last node.
1599         // In 'rv', left' is the first node and 'right' is a list.
1600         static struct binode *reorder_bilist(struct binode *b)
1601         {
1602                 struct binode *rv = NULL;
1603
1604                 while (b) {
1605                         struct exec *t = b->right;
1606                         b->right = rv;
1607                         rv = b;
1608                         if (b->left)
1609                                 b = cast(binode, b->left);
1610                         else
1611                                 b = NULL;
1612                         rv->left = t;
1613                 }
1614                 return rv;
1615         }
1616
1617 ### Variables
1618
1619 Just as we used a `val` to wrap a value into an `exec`, we similarly
1620 need a `var` to wrap a `variable` into an exec.  While each `val`
1621 contained a copy of the value, each `var` hold a link to the variable
1622 because it really is the same variable no matter where it appears.
1623 When a variable is used, we need to remember to follow the `->merged`
1624 link to find the primary instance.
1625
1626 ###### exec type
1627         Xvar,
1628
1629 ###### ast
1630         struct var {
1631                 struct exec;
1632                 struct variable *var;
1633         };
1634
1635 ###### Grammar
1636
1637         $*var
1638         VariableDecl -> IDENTIFIER : ${ {
1639                 struct variable *v = var_decl(config2context(config), $1.txt);
1640                 $0 = new_pos(var, $1);
1641                 $0->var = v;
1642                 if (v)
1643                         v->where_decl = $0;
1644                 else {
1645                         v = var_ref(config2context(config), $1.txt);
1646                         $0->var = v;
1647                         type_err(config2context(config), "error: variable '%v' redeclared",
1648                                  $0, Tnone, 0, Tnone);
1649                         type_err(config2context(config), "info: this is where '%v' was first declared",
1650                                  v->where_decl, Tnone, 0, Tnone);
1651                 }
1652         } }$
1653             | IDENTIFIER :: ${ {
1654                 struct variable *v = var_decl(config2context(config), $1.txt);
1655                 $0 = new_pos(var, $1);
1656                 $0->var = v;
1657                 if (v) {
1658                         v->where_decl = $0;
1659                         v->constant = 1;
1660                 } else {
1661                         v = var_ref(config2context(config), $1.txt);
1662                         $0->var = v;
1663                         type_err(config2context(config), "error: variable '%v' redeclared",
1664                                  $0, Tnone, 0, Tnone);
1665                         type_err(config2context(config), "info: this is where '%v' was first declared",
1666                                  v->where_decl, Tnone, 0, Tnone);
1667                 }
1668         } }$
1669             | IDENTIFIER : Type ${ {
1670                 struct variable *v = var_decl(config2context(config), $1.txt);
1671                 $0 = new_pos(var, $1);
1672                 $0->var = v;
1673                 if (v) {
1674                         v->where_decl = $0;
1675                         v->where_set = $0;
1676                         v->val = val_prepare($<3);
1677                 } else {
1678                         v = var_ref(config2context(config), $1.txt);
1679                         $0->var = v;
1680                         type_err(config2context(config), "error: variable '%v' redeclared",
1681                                  $0, Tnone, 0, Tnone);
1682                         type_err(config2context(config), "info: this is where '%v' was first declared",
1683                                  v->where_decl, Tnone, 0, Tnone);
1684                 }
1685         } }$
1686             | IDENTIFIER :: Type ${ {
1687                 struct variable *v = var_decl(config2context(config), $1.txt);
1688                 $0 = new_pos(var, $1);
1689                 $0->var = v;
1690                 if (v) {
1691                         v->where_decl = $0;
1692                         v->where_set = $0;
1693                         v->val = val_prepare($<3);
1694                         v->constant = 1;
1695                 } else {
1696                         v = var_ref(config2context(config), $1.txt);
1697                         $0->var = v;
1698                         type_err(config2context(config), "error: variable '%v' redeclared",
1699                                  $0, Tnone, 0, Tnone);
1700                         type_err(config2context(config), "info: this is where '%v' was first declared",
1701                                  v->where_decl, Tnone, 0, Tnone);
1702                 }
1703         } }$
1704
1705         Variable -> IDENTIFIER ${ {
1706                 struct variable *v = var_ref(config2context(config), $1.txt);
1707                 $0 = new_pos(var, $1);
1708                 if (v == NULL) {
1709                         /* This might be a label - allocate a var just in case */
1710                         v = var_decl(config2context(config), $1.txt);
1711                         if (v) {
1712                                 v->val = val_prepare(Tlabel);
1713                                 v->val.label = &v->val;
1714                                 v->where_set = $0;
1715                         }
1716                 }
1717                 $0->var = v;
1718         } }$
1719
1720         $*type
1721         Type -> IDENTIFIER ${
1722                 $0 = find_type(config2context(config), $1.txt);
1723                 if (!$0) {
1724                         tok_err(config2context(config),
1725                                 "error: undefined type", &$1);
1726
1727                         $0 = Tnone;
1728                 }
1729         }$
1730
1731 ###### print exec cases
1732         case Xvar:
1733         {
1734                 struct var *v = cast(var, e);
1735                 if (v->var) {
1736                         struct binding *b = v->var->name;
1737                         printf("%.*s", b->name.len, b->name.txt);
1738                 }
1739                 break;
1740         }
1741
1742 ###### format cases
1743         case 'v':
1744                 if (loc->type == Xvar) {
1745                         struct var *v = cast(var, loc);
1746                         if (v->var) {
1747                                 struct binding *b = v->var->name;
1748                                 fprintf(stderr, "%.*s", b->name.len, b->name.txt);
1749                         } else
1750                                 fputs("???", stderr);
1751                 } else
1752                         fputs("NOTVAR", stderr);
1753                 break;
1754
1755 ###### propagate exec cases
1756
1757         case Xvar:
1758         {
1759                 struct var *var = cast(var, prog);
1760                 struct variable *v = var->var;
1761                 if (!v) {
1762                         type_err(c, "%d:BUG: no variable!!", prog, Tnone, 0, Tnone);
1763                         *ok = 0;
1764                         return Tnone;
1765                 }
1766                 if (v->merged)
1767                         v = v->merged;
1768                 if (v->val.type == NULL) {
1769                         if (type && *ok != 0) {
1770                                 v->val = val_prepare(type);
1771                                 v->where_set = prog;
1772                                 *ok = 2;
1773                         }
1774                         return type;
1775                 }
1776                 if (!type_compat(type, v->val.type, rules)) {
1777                         type_err(c, "error: expected %1%r but variable '%v' is %2", prog,
1778                                  type, rules, v->val.type);
1779                         type_err(c, "info: this is where '%v' was set to %1", v->where_set,
1780                                  v->val.type, rules, Tnone);
1781                         *ok = 0;
1782                 }
1783                 if (!type)
1784                         return v->val.type;
1785                 return type;
1786         }
1787
1788 ###### interp exec cases
1789         case Xvar:
1790         {
1791                 struct var *var = cast(var, e);
1792                 struct variable *v = var->var;
1793
1794                 if (v->merged)
1795                         v = v->merged;
1796                 return dup_value(v->val);
1797         }
1798
1799 ###### ast functions
1800
1801         static void free_var(struct var *v)
1802         {
1803                 free(v);
1804         }
1805
1806 ###### free exec cases
1807         case Xvar: free_var(cast(var, e)); break;
1808
1809 ### Expressions: Boolean
1810
1811 Our first user of the `binode` will be expressions, and particularly
1812 Boolean expressions.  As I haven't implemented precedence in the
1813 parser generator yet, we need different names for each precedence
1814 level used by expressions.  The outer most or lowest level precedence
1815 are Boolean `or` `and`, and `not` which form an `Expression` out of `BTerm`s
1816 and `BFact`s.
1817
1818 ###### Binode types
1819         And,
1820         Or,
1821         Not,
1822
1823 ###### Grammar
1824
1825         $*exec
1826         Expression -> Expression or BTerm ${ {
1827                         struct binode *b = new(binode);
1828                         b->op = Or;
1829                         b->left = $<1;
1830                         b->right = $<3;
1831                         $0 = b;
1832                 } }$
1833                 | BTerm ${ $0 = $<1; }$
1834
1835         BTerm -> BTerm and BFact ${ {
1836                         struct binode *b = new(binode);
1837                         b->op = And;
1838                         b->left = $<1;
1839                         b->right = $<3;
1840                         $0 = b;
1841                 } }$
1842                 | BFact ${ $0 = $<1; }$
1843
1844         BFact -> not BFact ${ {
1845                         struct binode *b = new(binode);
1846                         b->op = Not;
1847                         b->right = $<2;
1848                         $0 = b;
1849                 } }$
1850                 ## other BFact
1851
1852 ###### print binode cases
1853         case And:
1854                 print_exec(b->left, -1, 0);
1855                 printf(" and ");
1856                 print_exec(b->right, -1, 0);
1857                 break;
1858         case Or:
1859                 print_exec(b->left, -1, 0);
1860                 printf(" or ");
1861                 print_exec(b->right, -1, 0);
1862                 break;
1863         case Not:
1864                 printf("not ");
1865                 print_exec(b->right, -1, 0);
1866                 break;
1867
1868 ###### propagate binode cases
1869         case And:
1870         case Or:
1871         case Not:
1872                 /* both must be Tbool, result is Tbool */
1873                 propagate_types(b->left, c, ok, Tbool, 0);
1874                 propagate_types(b->right, c, ok, Tbool, 0);
1875                 if (type && type != Tbool) {
1876                         type_err(c, "error: %1 operation found where %2 expected", prog,
1877                                    Tbool, 0, type);
1878                         *ok = 0;
1879                 }
1880                 return Tbool;
1881
1882 ###### interp binode cases
1883         case And:
1884                 rv = interp_exec(b->left);
1885                 right = interp_exec(b->right);
1886                 rv.bool = rv.bool && right.bool;
1887                 break;
1888         case Or:
1889                 rv = interp_exec(b->left);
1890                 right = interp_exec(b->right);
1891                 rv.bool = rv.bool || right.bool;
1892                 break;
1893         case Not:
1894                 rv = interp_exec(b->right);
1895                 rv.bool = !rv.bool;
1896                 break;
1897
1898 ### Expressions: Comparison
1899
1900 Of slightly higher precedence that Boolean expressions are
1901 Comparisons.
1902 A comparison takes arguments of any type, but the two types must be
1903 the same.
1904
1905 To simplify the parsing we introduce an `eop` which can record an
1906 expression operator.
1907
1908 ###### ast
1909         struct eop {
1910                 enum Btype op;
1911         };
1912
1913 ###### ast functions
1914         static void free_eop(struct eop *e)
1915         {
1916                 if (e)
1917                         free(e);
1918         }
1919
1920 ###### Binode types
1921         Less,
1922         Gtr,
1923         LessEq,
1924         GtrEq,
1925         Eql,
1926         NEql,
1927
1928 ###### other BFact
1929         | Expr CMPop Expr ${ {
1930                         struct binode *b = new(binode);
1931                         b->op = $2.op;
1932                         b->left = $<1;
1933                         b->right = $<3;
1934                         $0 = b;
1935         } }$
1936         | Expr ${ $0 = $<1; }$
1937
1938 ###### Grammar
1939
1940         $eop
1941         CMPop ->   < ${ $0.op = Less; }$
1942                 |  > ${ $0.op = Gtr; }$
1943                 |  <= ${ $0.op = LessEq; }$
1944                 |  >= ${ $0.op = GtrEq; }$
1945                 |  == ${ $0.op = Eql; }$
1946                 |  != ${ $0.op = NEql; }$
1947
1948 ###### print binode cases
1949
1950         case Less:
1951         case LessEq:
1952         case Gtr:
1953         case GtrEq:
1954         case Eql:
1955         case NEql:
1956                 print_exec(b->left, -1, 0);
1957                 switch(b->op) {
1958                 case Less:   printf(" < "); break;
1959                 case LessEq: printf(" <= "); break;
1960                 case Gtr:    printf(" > "); break;
1961                 case GtrEq:  printf(" >= "); break;
1962                 case Eql:    printf(" == "); break;
1963                 case NEql:   printf(" != "); break;
1964                 default: abort();
1965                 }
1966                 print_exec(b->right, -1, 0);
1967                 break;
1968
1969 ###### propagate binode cases
1970         case Less:
1971         case LessEq:
1972         case Gtr:
1973         case GtrEq:
1974         case Eql:
1975         case NEql:
1976                 /* Both must match but not be labels, result is Tbool */
1977                 t = propagate_types(b->left, c, ok, NULL, Rnolabel);
1978                 if (t)
1979                         propagate_types(b->right, c, ok, t, 0);
1980                 else {
1981                         t = propagate_types(b->right, c, ok, NULL, Rnolabel);
1982                         if (t)
1983                                 t = propagate_types(b->left, c, ok, t, 0);
1984                 }
1985                 if (!type_compat(type, Tbool, 0)) {
1986                         type_err(c, "error: Comparison returns %1 but %2 expected", prog,
1987                                     Tbool, rules, type);
1988                         *ok = 0;
1989                 }
1990                 return Tbool;
1991
1992 ###### interp binode cases
1993         case Less:
1994         case LessEq:
1995         case Gtr:
1996         case GtrEq:
1997         case Eql:
1998         case NEql:
1999         {
2000                 int cmp;
2001                 left = interp_exec(b->left);
2002                 right = interp_exec(b->right);
2003                 cmp = value_cmp(left, right);
2004                 rv.type = Tbool;
2005                 switch (b->op) {
2006                 case Less:      rv.bool = cmp <  0; break;
2007                 case LessEq:    rv.bool = cmp <= 0; break;
2008                 case Gtr:       rv.bool = cmp >  0; break;
2009                 case GtrEq:     rv.bool = cmp >= 0; break;
2010                 case Eql:       rv.bool = cmp == 0; break;
2011                 case NEql:      rv.bool = cmp != 0; break;
2012                 default: rv.bool = 0; break;
2013                 }
2014                 break;
2015         }
2016
2017 ### Expressions: The rest
2018
2019 The remaining expressions with the highest precedence are arithmetic
2020 and string concatenation.  They are `Expr`, `Term`, and `Factor`.
2021 The `Factor` is where the `Value` and `Variable` that we already have
2022 are included.
2023
2024 `+` and `-` are both infix and prefix operations (where they are
2025 absolute value and negation).  These have different operator names.
2026
2027 We also have a 'Bracket' operator which records where parentheses were
2028 found.  This makes it easy to reproduce these when printing.  Once
2029 precedence is handled better I might be able to discard this.
2030
2031 ###### Binode types
2032         Plus, Minus,
2033         Times, Divide,
2034         Concat,
2035         Absolute, Negate,
2036         Bracket,
2037
2038 ###### Grammar
2039
2040         $*exec
2041         Expr -> Expr Eop Term ${ {
2042                         struct binode *b = new(binode);
2043                         b->op = $2.op;
2044                         b->left = $<1;
2045                         b->right = $<3;
2046                         $0 = b;
2047                 } }$
2048                 | Term ${ $0 = $<1; }$
2049
2050         Term -> Term Top Factor ${ {
2051                         struct binode *b = new(binode);
2052                         b->op = $2.op;
2053                         b->left = $<1;
2054                         b->right = $<3;
2055                         $0 = b;
2056                 } }$
2057                 | Factor ${ $0 = $<1; }$
2058
2059         Factor -> ( Expression ) ${ {
2060                         struct binode *b = new_pos(binode, $1);
2061                         b->op = Bracket;
2062                         b->right = $<2;
2063                         $0 = b;
2064                 } }$
2065                 | Uop Factor ${ {
2066                         struct binode *b = new(binode);
2067                         b->op = $1.op;
2068                         b->right = $<2;
2069                         $0 = b;
2070                 } }$
2071                 | Value ${ $0 = $<1; }$
2072                 | Variable ${ $0 = $<1; }$
2073
2074         $eop
2075         Eop ->    + ${ $0.op = Plus; }$
2076                 | - ${ $0.op = Minus; }$
2077
2078         Uop ->    + ${ $0.op = Absolute; }$
2079                 | - ${ $0.op = Negate; }$
2080
2081         Top ->    * ${ $0.op = Times; }$
2082                 | / ${ $0.op = Divide; }$
2083                 | ++ ${ $0.op = Concat; }$
2084
2085 ###### print binode cases
2086         case Plus:
2087         case Minus:
2088         case Times:
2089         case Divide:
2090         case Concat:
2091                 print_exec(b->left, indent, 0);
2092                 switch(b->op) {
2093                 case Plus:   printf(" + "); break;
2094                 case Minus:  printf(" - "); break;
2095                 case Times:  printf(" * "); break;
2096                 case Divide: printf(" / "); break;
2097                 case Concat: printf(" ++ "); break;
2098                 default: abort();
2099                 }
2100                 print_exec(b->right, indent, 0);
2101                 break;
2102         case Absolute:
2103                 printf("+");
2104                 print_exec(b->right, indent, 0);
2105                 break;
2106         case Negate:
2107                 printf("-");
2108                 print_exec(b->right, indent, 0);
2109                 break;
2110         case Bracket:
2111                 printf("(");
2112                 print_exec(b->right, indent, 0);
2113                 printf(")");
2114                 break;
2115
2116 ###### propagate binode cases
2117         case Plus:
2118         case Minus:
2119         case Times:
2120         case Divide:
2121                 /* both must be numbers, result is Tnum */
2122         case Absolute:
2123         case Negate:
2124                 /* as propagate_types ignores a NULL,
2125                  * unary ops fit here too */
2126                 propagate_types(b->left, c, ok, Tnum, 0);
2127                 propagate_types(b->right, c, ok, Tnum, 0);
2128                 if (!type_compat(type, Tnum, 0)) {
2129                         type_err(c, "error: Arithmetic returns %1 but %2 expected", prog,
2130                                    Tnum, rules, type);
2131                         *ok = 0;
2132                 }
2133                 return Tnum;
2134
2135         case Concat:
2136                 /* both must be Tstr, result is Tstr */
2137                 propagate_types(b->left, c, ok, Tstr, 0);
2138                 propagate_types(b->right, c, ok, Tstr, 0);
2139                 if (!type_compat(type, Tstr, 0)) {
2140                         type_err(c, "error: Concat returns %1 but %2 expected", prog,
2141                                    Tstr, rules, type);
2142                         *ok = 0;
2143                 }
2144                 return Tstr;
2145
2146         case Bracket:
2147                 return propagate_types(b->right, c, ok, type, 0);
2148
2149 ###### interp binode cases
2150
2151         case Plus:
2152                 rv = interp_exec(b->left);
2153                 right = interp_exec(b->right);
2154                 mpq_add(rv.num, rv.num, right.num);
2155                 break;
2156         case Minus:
2157                 rv = interp_exec(b->left);
2158                 right = interp_exec(b->right);
2159                 mpq_sub(rv.num, rv.num, right.num);
2160                 break;
2161         case Times:
2162                 rv = interp_exec(b->left);
2163                 right = interp_exec(b->right);
2164                 mpq_mul(rv.num, rv.num, right.num);
2165                 break;
2166         case Divide:
2167                 rv = interp_exec(b->left);
2168                 right = interp_exec(b->right);
2169                 mpq_div(rv.num, rv.num, right.num);
2170                 break;
2171         case Negate:
2172                 rv = interp_exec(b->right);
2173                 mpq_neg(rv.num, rv.num);
2174                 break;
2175         case Absolute:
2176                 rv = interp_exec(b->right);
2177                 mpq_abs(rv.num, rv.num);
2178                 break;
2179         case Bracket:
2180                 rv = interp_exec(b->right);
2181                 break;
2182         case Concat:
2183                 left = interp_exec(b->left);
2184                 right = interp_exec(b->right);
2185                 rv.type = Tstr;
2186                 rv.str = text_join(left.str, right.str);
2187                 break;
2188
2189
2190 ###### value functions
2191
2192         static struct text text_join(struct text a, struct text b)
2193         {
2194                 struct text rv;
2195                 rv.len = a.len + b.len;
2196                 rv.txt = malloc(rv.len);
2197                 memcpy(rv.txt, a.txt, a.len);
2198                 memcpy(rv.txt+a.len, b.txt, b.len);
2199                 return rv;
2200         }
2201
2202
2203 ### Blocks, Statements, and Statement lists.
2204
2205 Now that we have expressions out of the way we need to turn to
2206 statements.  There are simple statements and more complex statements.
2207 Simple statements do not contain newlines, complex statements do.
2208
2209 Statements often come in sequences and we have corresponding simple
2210 statement lists and complex statement lists.
2211 The former comprise only simple statements separated by semicolons.
2212 The later comprise complex statements and simple statement lists.  They are
2213 separated by newlines.  Thus the semicolon is only used to separate
2214 simple statements on the one line.  This may be overly restrictive,
2215 but I'm not sure I ever want a complex statement to share a line with
2216 anything else.
2217
2218 Note that a simple statement list can still use multiple lines if
2219 subsequent lines are indented, so
2220
2221 ###### Example: wrapped simple statement list
2222
2223         a = b; c = d;
2224            e = f; print g
2225
2226 is a single simple statement list.  This might allow room for
2227 confusion, so I'm not set on it yet.
2228
2229 A simple statement list needs no extra syntax.  A complex statement
2230 list has two syntactic forms.  It can be enclosed in braces (much like
2231 C blocks), or it can be introduced by a colon and continue until an
2232 unindented newline (much like Python blocks).  With this extra syntax
2233 it is referred to as a block.
2234
2235 Note that a block does not have to include any newlines if it only
2236 contains simple statements.  So both of:
2237
2238         if condition: a=b; d=f
2239
2240         if condition { a=b; print f }
2241
2242 are valid.
2243
2244 In either case the list is constructed from a `binode` list with
2245 `Block` as the operator.  When parsing the list it is most convenient
2246 to append to the end, so a list is a list and a statement.  When using
2247 the list it is more convenient to consider a list to be a statement
2248 and a list.  So we need a function to re-order a list.
2249 `reorder_bilist` serves this purpose.
2250
2251 The only stand-alone statement we introduce at this stage is `pass`
2252 which does nothing and is represented as a `NULL` pointer in a `Block`
2253 list.  Other stand-alone statements will follow once the infrastructure
2254 is in-place.
2255
2256 ###### Binode types
2257         Block,
2258
2259 ###### Grammar
2260
2261         $void
2262         OptNL -> Newlines
2263                 |
2264
2265         Newlines -> NEWLINE
2266                 | Newlines NEWLINE
2267
2268         $*binode
2269         Open -> {
2270                 | NEWLINE {
2271         Close -> }
2272                 | NEWLINE }
2273         Block -> Open Statementlist Close ${ $0 = $<2; }$
2274                 | Open Newlines Statementlist Close ${ $0 = $<3; }$
2275                 | Open SimpleStatements } ${ $0 = reorder_bilist($<2); }$
2276                 | Open Newlines SimpleStatements } ${ $0 = reorder_bilist($<3); }$
2277                 | : Statementlist ${ $0 = $<2; }$
2278                 | : SimpleStatements ${ $0 = reorder_bilist($<2); }$
2279
2280         Statementlist -> ComplexStatements ${ $0 = reorder_bilist($<1); }$
2281
2282         ComplexStatements -> ComplexStatements ComplexStatement ${
2283                 $0 = new(binode);
2284                 $0->op = Block;
2285                 $0->left = $<1;
2286                 $0->right = $<2;
2287                 }$
2288                 | ComplexStatements NEWLINE ${ $0 = $<1; }$
2289                 | ComplexStatement ${
2290                 $0 = new(binode);
2291                 $0->op = Block;
2292                 $0->left = NULL;
2293                 $0->right = $<1;
2294                 }$
2295
2296         $*exec
2297         ComplexStatement -> SimpleStatements NEWLINE ${
2298                         $0 = reorder_bilist($<1);
2299                         }$
2300                 ## ComplexStatement Grammar
2301
2302         $*binode
2303         SimpleStatements -> SimpleStatements ; SimpleStatement ${
2304                         $0 = new(binode);
2305                         $0->op = Block;
2306                         $0->left = $<1;
2307                         $0->right = $<3;
2308                         }$
2309                 | SimpleStatement ${
2310                         $0 = new(binode);
2311                         $0->op = Block;
2312                         $0->left = NULL;
2313                         $0->right = $<1;
2314                         }$
2315                 | SimpleStatements ; ${ $0 = $<1; }$
2316
2317         SimpleStatement -> pass ${ $0 = NULL; }$
2318                 ## SimpleStatement Grammar
2319
2320 ###### print binode cases
2321         case Block:
2322                 if (indent < 0) {
2323                         // simple statement
2324                         if (b->left == NULL)
2325                                 printf("pass");
2326                         else
2327                                 print_exec(b->left, indent, 0);
2328                         if (b->right) {
2329                                 printf("; ");
2330                                 print_exec(b->right, indent, 0);
2331                         }
2332                 } else {
2333                         // block, one per line
2334                         if (b->left == NULL)
2335                                 do_indent(indent, "pass\n");
2336                         else
2337                                 print_exec(b->left, indent, bracket);
2338                         if (b->right)
2339                                 print_exec(b->right, indent, bracket);
2340                 }
2341                 break;
2342
2343 ###### propagate binode cases
2344         case Block:
2345         {
2346                 /* If any statement returns something other than Tnone
2347                  * or Tbool then all such must return same type.
2348                  * As each statement may be Tnone or something else,
2349                  * we must always pass NULL (unknown) down, otherwise an incorrect
2350                  * error might occur.  We never return Tnone unless it is
2351                  * passed in.
2352                  */
2353                 struct binode *e;
2354
2355                 for (e = b; e; e = cast(binode, e->right)) {
2356                         t = propagate_types(e->left, c, ok, NULL, rules);
2357                         if ((rules & Rboolok) && t == Tbool)
2358                                 t = NULL;
2359                         if (t && t != Tnone && t != Tbool) {
2360                                 if (!type)
2361                                         type = t;
2362                                 else if (t != type) {
2363                                         type_err(c, "error: expected %1%r, found %2",
2364                                                  e->left, type, rules, t);
2365                                         *ok = 0;
2366                                 }
2367                         }
2368                 }
2369                 return type;
2370         }
2371
2372 ###### interp binode cases
2373         case Block:
2374                 while (rv.type == Tnone &&
2375                        b) {
2376                         if (b->left)
2377                                 rv = interp_exec(b->left);
2378                         b = cast(binode, b->right);
2379                 }
2380                 break;
2381
2382 ### The Print statement
2383
2384 `print` is a simple statement that takes a comma-separated list of
2385 expressions and prints the values separated by spaces and terminated
2386 by a newline.  No control of formatting is possible.
2387
2388 `print` faces the same list-ordering issue as blocks, and uses the
2389 same solution.
2390
2391 ###### Binode types
2392         Print,
2393
2394 ###### SimpleStatement Grammar
2395
2396         | print ExpressionList ${
2397                 $0 = reorder_bilist($<2);
2398         }$
2399         | print ExpressionList , ${
2400                 $0 = new(binode);
2401                 $0->op = Print;
2402                 $0->right = NULL;
2403                 $0->left = $<2;
2404                 $0 = reorder_bilist($0);
2405         }$
2406         | print ${
2407                 $0 = new(binode);
2408                 $0->op = Print;
2409                 $0->right = NULL;
2410         }$
2411
2412 ###### Grammar
2413
2414         $*binode
2415         ExpressionList -> ExpressionList , Expression ${
2416                 $0 = new(binode);
2417                 $0->op = Print;
2418                 $0->left = $<1;
2419                 $0->right = $<3;
2420                 }$
2421                 | Expression ${
2422                         $0 = new(binode);
2423                         $0->op = Print;
2424                         $0->left = NULL;
2425                         $0->right = $<1;
2426                 }$
2427
2428 ###### print binode cases
2429
2430         case Print:
2431                 do_indent(indent, "print");
2432                 while (b) {
2433                         if (b->left) {
2434                                 printf(" ");
2435                                 print_exec(b->left, -1, 0);
2436                                 if (b->right)
2437                                         printf(",");
2438                         }
2439                         b = cast(binode, b->right);
2440                 }
2441                 if (indent >= 0)
2442                         printf("\n");
2443                 break;
2444
2445 ###### propagate binode cases
2446
2447         case Print:
2448                 /* don't care but all must be consistent */
2449                 propagate_types(b->left, c, ok, NULL, Rnolabel);
2450                 propagate_types(b->right, c, ok, NULL, Rnolabel);
2451                 break;
2452
2453 ###### interp binode cases
2454
2455         case Print:
2456         {
2457                 char sep = 0;
2458                 int eol = 1;
2459                 for ( ; b; b = cast(binode, b->right))
2460                         if (b->left) {
2461                                 if (sep)
2462                                         putchar(sep);
2463                                 left = interp_exec(b->left);
2464                                 print_value(left);
2465                                 free_value(left);
2466                                 if (b->right)
2467                                         sep = ' ';
2468                         } else if (sep)
2469                                 eol = 0;
2470                 left.type = Tnone;
2471                 if (eol)
2472                         printf("\n");
2473                 break;
2474         }
2475
2476 ###### Assignment statement
2477
2478 An assignment will assign a value to a variable, providing it hasn't
2479 be declared as a constant.  The analysis phase ensures that the type
2480 will be correct so the interpreter just needs to perform the
2481 calculation.  There is a form of assignment which declares a new
2482 variable as well as assigning a value.  If a name is assigned before
2483 it is declared, and error will be raised as the name is created as
2484 `Tlabel` and it is illegal to assign to such names.
2485
2486 ###### Binode types
2487         Assign,
2488         Declare,
2489
2490 ###### SimpleStatement Grammar
2491         | Variable = Expression ${ {
2492                         struct var *v = cast(var, $1);
2493
2494                         $0 = new(binode);
2495                         $0->op = Assign;
2496                         $0->left = $<1;
2497                         $0->right = $<3;
2498                         if (v->var && v->var->constant) {
2499                                 type_err(config2context(config), "Cannot assign to a constant: %v",
2500                                          $0->left, NULL, 0, NULL);
2501                                 type_err(config2context(config), "name was defined as a constant here",
2502                                          v->var->where_decl, NULL, 0, NULL);
2503                         }
2504                 } }$
2505         | VariableDecl = Expression ${
2506                         $0 = new(binode);
2507                         $0->op = Declare;
2508                         $0->left = $<1;
2509                         $0->right =$<3;
2510                 }$
2511
2512         | VariableDecl ${
2513                         if ($1->var->where_set == NULL) {
2514                                 type_err(config2context(config), "Variable declared with no type or value: %v",
2515                                          $1, NULL, 0, NULL);
2516                         } else {
2517                                 $0 = new(binode);
2518                                 $0->op = Declare;
2519                                 $0->left = $<1;
2520                                 $0->right = NULL;
2521                         }
2522                 }$
2523
2524 ###### print binode cases
2525
2526         case Assign:
2527                 do_indent(indent, "");
2528                 print_exec(b->left, indent, 0);
2529                 printf(" = ");
2530                 print_exec(b->right, indent, 0);
2531                 if (indent >= 0)
2532                         printf("\n");
2533                 break;
2534
2535         case Declare:
2536                 {
2537                 struct variable *v = cast(var, b->left)->var;
2538                 do_indent(indent, "");
2539                 print_exec(b->left, indent, 0);
2540                 if (cast(var, b->left)->var->constant) {
2541                         if (v->where_decl == v->where_set) {
2542                                 printf("::");
2543                                 type_print(v->val.type, stdout);
2544                                 printf(" ");
2545                         } else
2546                                 printf(" ::");
2547                 } else {
2548                         if (v->where_decl == v->where_set) {
2549                                 printf(":");
2550                                 type_print(v->val.type, stdout);
2551                                 printf(" ");
2552                         } else
2553                                 printf(" :");
2554                 }
2555                 if (b->right) {
2556                         printf("= ");
2557                         print_exec(b->right, indent, 0);
2558                 }
2559                 if (indent >= 0)
2560                         printf("\n");
2561                 }
2562                 break;
2563
2564 ###### propagate binode cases
2565
2566         case Assign:
2567         case Declare:
2568                 /* Both must match and not be labels,
2569                  * Type must support 'dup',
2570                  * result is Tnone */
2571                 t = propagate_types(b->left, c, ok, NULL, Rnolabel);
2572                 if (!b->right)
2573                         return Tnone;
2574
2575                 if (t) {
2576                         if (propagate_types(b->right, c, ok, t, 0) != t)
2577                                 if (b->left->type == Xvar)
2578                                         type_err(c, "info: variable '%v' was set as %1 here.",
2579                                                  cast(var, b->left)->var->where_set, t, rules, Tnone);
2580                 } else {
2581                         t = propagate_types(b->right, c, ok, NULL, Rnolabel);
2582                         if (t)
2583                                 propagate_types(b->left, c, ok, t, 0);
2584                 }
2585                 if (t && t->dup == NULL) {
2586                         type_err(c, "error: cannot assign value of type %1", b, t, 0, NULL);
2587                         *ok = 0;
2588                 }
2589                 return Tnone;
2590
2591                 break;
2592
2593 ###### interp binode cases
2594
2595         case Assign:
2596         {
2597                 struct variable *v = cast(var, b->left)->var;
2598                 if (v->merged)
2599                         v = v->merged;
2600                 right = interp_exec(b->right);
2601                 free_value(v->val);
2602                 v->val = right;
2603                 right.type = NULL;
2604                 break;
2605         }
2606
2607         case Declare:
2608         {
2609                 struct variable *v = cast(var, b->left)->var;
2610                 if (v->merged)
2611                         v = v->merged;
2612                 if (b->right)
2613                         right = interp_exec(b->right);
2614                 else
2615                         right = val_init(v->val.type);
2616                 free_value(v->val);
2617                 v->val = right;
2618                 right.type = NULL;
2619                 break;
2620         }
2621
2622 ### The `use` statement
2623
2624 The `use` statement is the last "simple" statement.  It is needed when
2625 the condition in a conditional statement is a block.  `use` works much
2626 like `return` in C, but only completes the `condition`, not the whole
2627 function.
2628
2629 ###### Binode types
2630         Use,
2631
2632 ###### SimpleStatement Grammar
2633         | use Expression ${
2634                 $0 = new_pos(binode, $1);
2635                 $0->op = Use;
2636                 $0->right = $<2;
2637         }$
2638
2639 ###### print binode cases
2640
2641         case Use:
2642                 do_indent(indent, "use ");
2643                 print_exec(b->right, -1, 0);
2644                 if (indent >= 0)
2645                         printf("\n");
2646                 break;
2647
2648 ###### propagate binode cases
2649
2650         case Use:
2651                 /* result matches value */
2652                 return propagate_types(b->right, c, ok, type, 0);
2653
2654 ###### interp binode cases
2655
2656         case Use:
2657                 rv = interp_exec(b->right);
2658                 break;
2659
2660 ### The Conditional Statement
2661
2662 This is the biggy and currently the only complex statement.  This
2663 subsumes `if`, `while`, `do/while`, `switch`, and some parts of `for`.
2664 It is comprised of a number of parts, all of which are optional though
2665 set combinations apply.  Each part is (usually) a key word (`then` is
2666 sometimes optional) followed by either an expression or a code block,
2667 except the `casepart` which is a "key word and an expression" followed
2668 by a code block.  The code-block option is valid for all parts and,
2669 where an expression is also allowed, the code block can use the `use`
2670 statement to report a value.  If the code block does not report a value
2671 the effect is similar to reporting `True`.
2672
2673 The `else` and `case` parts, as well as `then` when combined with
2674 `if`, can contain a `use` statement which will apply to some
2675 containing conditional statement. `for` parts, `do` parts and `then`
2676 parts used with `for` can never contain a `use`, except in some
2677 subordinate conditional statement.
2678
2679 If there is a `forpart`, it is executed first, only once.
2680 If there is a `dopart`, then it is executed repeatedly providing
2681 always that the `condpart` or `cond`, if present, does not return a non-True
2682 value.  `condpart` can fail to return any value if it simply executes
2683 to completion.  This is treated the same as returning `True`.
2684
2685 If there is a `thenpart` it will be executed whenever the `condpart`
2686 or `cond` returns True (or does not return any value), but this will happen
2687 *after* `dopart` (when present).
2688
2689 If `elsepart` is present it will be executed at most once when the
2690 condition returns `False` or some value that isn't `True` and isn't
2691 matched by any `casepart`.  If there are any `casepart`s, they will be
2692 executed when the condition returns a matching value.
2693
2694 The particular sorts of values allowed in case parts has not yet been
2695 determined in the language design, so nothing is prohibited.
2696
2697 The various blocks in this complex statement potentially provide scope
2698 for variables as described earlier.  Each such block must include the
2699 "OpenScope" nonterminal before parsing the block, and must call
2700 `var_block_close()` when closing the block.
2701
2702 The code following "`if`", "`switch`" and "`for`" does not get its own
2703 scope, but is in a scope covering the whole statement, so names
2704 declared there cannot be redeclared elsewhere.  Similarly the
2705 condition following "`while`" is in a scope the covers the body
2706 ("`do`" part) of the loop, and which does not allow conditional scope
2707 extension.  Code following "`then`" (both looping and non-looping),
2708 "`else`" and "`case`" each get their own local scope.
2709
2710 The type requirements on the code block in a `whilepart` are quite
2711 unusal.  It is allowed to return a value of some identifiable type, in
2712 which case the loop aborts and an appropriate `casepart` is run, or it
2713 can return a Boolean, in which case the loop either continues to the
2714 `dopart` (on `True`) or aborts and runs the `elsepart` (on `False`).
2715 This is different both from the `ifpart` code block which is expected to
2716 return a Boolean, or the `switchpart` code block which is expected to
2717 return the same type as the casepart values.  The correct analysis of
2718 the type of the `whilepart` code block is the reason for the
2719 `Rboolok` flag which is passed to `propagate_types()`.
2720
2721 The `cond_statement` cannot fit into a `binode` so a new `exec` is
2722 defined.
2723
2724 ###### exec type
2725         Xcond_statement,
2726
2727 ###### ast
2728         struct casepart {
2729                 struct exec *value;
2730                 struct exec *action;
2731                 struct casepart *next;
2732         };
2733         struct cond_statement {
2734                 struct exec;
2735                 struct exec *forpart, *condpart, *dopart, *thenpart, *elsepart;
2736                 struct casepart *casepart;
2737         };
2738
2739 ###### ast functions
2740
2741         static void free_casepart(struct casepart *cp)
2742         {
2743                 while (cp) {
2744                         struct casepart *t;
2745                         free_exec(cp->value);
2746                         free_exec(cp->action);
2747                         t = cp->next;
2748                         free(cp);
2749                         cp = t;
2750                 }
2751         }
2752
2753         static void free_cond_statement(struct cond_statement *s)
2754         {
2755                 if (!s)
2756                         return;
2757                 free_exec(s->forpart);
2758                 free_exec(s->condpart);
2759                 free_exec(s->dopart);
2760                 free_exec(s->thenpart);
2761                 free_exec(s->elsepart);
2762                 free_casepart(s->casepart);
2763                 free(s);
2764         }
2765
2766 ###### free exec cases
2767         case Xcond_statement: free_cond_statement(cast(cond_statement, e)); break;
2768
2769 ###### ComplexStatement Grammar
2770         | CondStatement ${ $0 = $<1; }$
2771
2772 ###### Grammar
2773
2774         $*cond_statement
2775         // both ForThen and Whilepart open scopes, and CondSuffix only
2776         // closes one - so in the first branch here we have another to close.
2777         CondStatement -> ForThen WhilePart CondSuffix ${
2778                         $0 = $<3;
2779                         $0->forpart = $1.forpart; $1.forpart = NULL;
2780                         $0->thenpart = $1.thenpart; $1.thenpart = NULL;
2781                         $0->condpart = $2.condpart; $2.condpart = NULL;
2782                         $0->dopart = $2.dopart; $2.dopart = NULL;
2783                         var_block_close(config2context(config), CloseSequential);
2784                         }$
2785                 | WhilePart CondSuffix ${
2786                         $0 = $<2;
2787                         $0->condpart = $1.condpart; $1.condpart = NULL;
2788                         $0->dopart = $1.dopart; $1.dopart = NULL;
2789                         }$
2790                 | SwitchPart CondSuffix ${
2791                         $0 = $<2;
2792                         $0->condpart = $<1;
2793                         }$
2794                 | IfPart IfSuffix ${
2795                         $0 = $<2;
2796                         $0->condpart = $1.condpart; $1.condpart = NULL;
2797                         $0->thenpart = $1.thenpart; $1.thenpart = NULL;
2798                         // This is where we close an "if" statement
2799                         var_block_close(config2context(config), CloseSequential);
2800                         }$
2801
2802         CondSuffix -> IfSuffix ${
2803                         $0 = $<1;
2804                         // This is where we close scope of the whole
2805                         // "for" or "while" statement
2806                         var_block_close(config2context(config), CloseSequential);
2807                 }$
2808                 | CasePart CondSuffix ${
2809                         $0 = $<2;
2810                         $1->next = $0->casepart;
2811                         $0->casepart = $<1;
2812                 }$
2813
2814         $*casepart
2815         CasePart -> Newlines case Expression OpenScope Block ${
2816                         $0 = calloc(1,sizeof(struct casepart));
2817                         $0->value = $<3;
2818                         $0->action = $<5;
2819                         var_block_close(config2context(config), CloseParallel);
2820                 }$
2821                 | case Expression OpenScope Block ${
2822                         $0 = calloc(1,sizeof(struct casepart));
2823                         $0->value = $<2;
2824                         $0->action = $<4;
2825                         var_block_close(config2context(config), CloseParallel);
2826                 }$
2827
2828         $*cond_statement
2829         IfSuffix -> Newlines ${ $0 = new(cond_statement); }$
2830                 | Newlines else OpenScope Block ${
2831                         $0 = new(cond_statement);
2832                         $0->elsepart = $<4;
2833                         var_block_close(config2context(config), CloseElse);
2834                 }$
2835                 | else OpenScope Block ${
2836                         $0 = new(cond_statement);
2837                         $0->elsepart = $<3;
2838                         var_block_close(config2context(config), CloseElse);
2839                 }$
2840                 | Newlines else OpenScope CondStatement ${
2841                         $0 = new(cond_statement);
2842                         $0->elsepart = $<4;
2843                         var_block_close(config2context(config), CloseElse);
2844                 }$
2845                 | else OpenScope CondStatement ${
2846                         $0 = new(cond_statement);
2847                         $0->elsepart = $<3;
2848                         var_block_close(config2context(config), CloseElse);
2849                 }$
2850
2851
2852         $*exec
2853         // These scopes are closed in CondSuffix
2854         ForPart -> for OpenScope SimpleStatements ${
2855                         $0 = reorder_bilist($<3);
2856                 }$
2857                 |  for OpenScope Block ${
2858                         $0 = $<3;
2859                 }$
2860
2861         ThenPart -> then OpenScope SimpleStatements ${
2862                         $0 = reorder_bilist($<3);
2863                         var_block_close(config2context(config), CloseSequential);
2864                 }$
2865                 |  then OpenScope Block ${
2866                         $0 = $<3;
2867                         var_block_close(config2context(config), CloseSequential);
2868                 }$
2869
2870         ThenPartNL -> ThenPart OptNL ${
2871                         $0 = $<1;
2872                 }$
2873
2874         // This scope is closed in CondSuffix
2875         WhileHead -> while OpenScope Block ${
2876                 $0 = $<3;
2877                 }$
2878
2879         $cond_statement
2880         ForThen -> ForPart OptNL ThenPartNL ${
2881                         $0.forpart = $<1;
2882                         $0.thenpart = $<3;
2883                 }$
2884                 | ForPart OptNL ${
2885                         $0.forpart = $<1;
2886                 }$
2887
2888         // This scope is closed in CondSuffix
2889         WhilePart -> while OpenScope Expression Block ${
2890                         $0.type = Xcond_statement;
2891                         $0.condpart = $<3;
2892                         $0.dopart = $<4;
2893                 }$
2894                 | WhileHead OptNL do Block ${
2895                         $0.type = Xcond_statement;
2896                         $0.condpart = $<1;
2897                         $0.dopart = $<4;
2898                 }$
2899
2900         IfPart -> if OpenScope Expression OpenScope Block ${
2901                         $0.type = Xcond_statement;
2902                         $0.condpart = $<3;
2903                         $0.thenpart = $<5;
2904                         var_block_close(config2context(config), CloseParallel);
2905                 }$
2906                 | if OpenScope Block OptNL then OpenScope Block ${
2907                         $0.type = Xcond_statement;
2908                         $0.condpart = $<3;
2909                         $0.thenpart = $<7;
2910                         var_block_close(config2context(config), CloseParallel);
2911                 }$
2912
2913         $*exec
2914         // This scope is closed in CondSuffix
2915         SwitchPart -> switch OpenScope Expression ${
2916                         $0 = $<3;
2917                 }$
2918                 | switch OpenScope Block ${
2919                         $0 = $<3;
2920                 }$
2921
2922 ###### print exec cases
2923
2924         case Xcond_statement:
2925         {
2926                 struct cond_statement *cs = cast(cond_statement, e);
2927                 struct casepart *cp;
2928                 if (cs->forpart) {
2929                         do_indent(indent, "for");
2930                         if (bracket) printf(" {\n"); else printf(":\n");
2931                         print_exec(cs->forpart, indent+1, bracket);
2932                         if (cs->thenpart) {
2933                                 if (bracket)
2934                                         do_indent(indent, "} then {\n");
2935                                 else
2936                                         do_indent(indent, "then:\n");
2937                                 print_exec(cs->thenpart, indent+1, bracket);
2938                         }
2939                         if (bracket) do_indent(indent, "}\n");
2940                 }
2941                 if (cs->dopart) {
2942                         // a loop
2943                         if (cs->condpart && cs->condpart->type == Xbinode &&
2944                             cast(binode, cs->condpart)->op == Block) {
2945                                 if (bracket)
2946                                         do_indent(indent, "while {\n");
2947                                 else
2948                                         do_indent(indent, "while:\n");
2949                                 print_exec(cs->condpart, indent+1, bracket);
2950                                 if (bracket)
2951                                         do_indent(indent, "} do {\n");
2952                                 else
2953                                         do_indent(indent, "do:\n");
2954                                 print_exec(cs->dopart, indent+1, bracket);
2955                                 if (bracket)
2956                                         do_indent(indent, "}\n");
2957                         } else {
2958                                 do_indent(indent, "while ");
2959                                 print_exec(cs->condpart, 0, bracket);
2960                                 if (bracket)
2961                                         printf(" {\n");
2962                                 else
2963                                         printf(":\n");
2964                                 print_exec(cs->dopart, indent+1, bracket);
2965                                 if (bracket)
2966                                         do_indent(indent, "}\n");
2967                         }
2968                 } else {
2969                         // a condition
2970                         if (cs->casepart)
2971                                 do_indent(indent, "switch");
2972                         else
2973                                 do_indent(indent, "if");
2974                         if (cs->condpart && cs->condpart->type == Xbinode &&
2975                             cast(binode, cs->condpart)->op == Block) {
2976                                 if (bracket)
2977                                         printf(" {\n");
2978                                 else
2979                                         printf(":\n");
2980                                 print_exec(cs->condpart, indent+1, bracket);
2981                                 if (bracket)
2982                                         do_indent(indent, "}\n");
2983                                 if (cs->thenpart) {
2984                                         do_indent(indent, "then:\n");
2985                                         print_exec(cs->thenpart, indent+1, bracket);
2986                                 }
2987                         } else {
2988                                 printf(" ");
2989                                 print_exec(cs->condpart, 0, bracket);
2990                                 if (cs->thenpart) {
2991                                         if (bracket)
2992                                                 printf(" {\n");
2993                                         else
2994                                                 printf(":\n");
2995                                         print_exec(cs->thenpart, indent+1, bracket);
2996                                         if (bracket)
2997                                                 do_indent(indent, "}\n");
2998                                 } else
2999                                         printf("\n");
3000                         }
3001                 }
3002                 for (cp = cs->casepart; cp; cp = cp->next) {
3003                         do_indent(indent, "case ");
3004                         print_exec(cp->value, -1, 0);
3005                         if (bracket)
3006                                 printf(" {\n");
3007                         else
3008                                 printf(":\n");
3009                         print_exec(cp->action, indent+1, bracket);
3010                         if (bracket)
3011                                 do_indent(indent, "}\n");
3012                 }
3013                 if (cs->elsepart) {
3014                         do_indent(indent, "else");
3015                         if (bracket)
3016                                 printf(" {\n");
3017                         else
3018                                 printf(":\n");
3019                         print_exec(cs->elsepart, indent+1, bracket);
3020                         if (bracket)
3021                                 do_indent(indent, "}\n");
3022                 }
3023                 break;
3024         }
3025
3026 ###### propagate exec cases
3027         case Xcond_statement:
3028         {
3029                 // forpart and dopart must return Tnone
3030                 // thenpart must return Tnone if there is a dopart,
3031                 // otherwise it is like elsepart.
3032                 // condpart must:
3033                 //    be bool if there is no casepart
3034                 //    match casepart->values if there is a switchpart
3035                 //    either be bool or match casepart->value if there
3036                 //             is a whilepart
3037                 // elsepart and casepart->action must match the return type
3038                 //   expected of this statement.
3039                 struct cond_statement *cs = cast(cond_statement, prog);
3040                 struct casepart *cp;
3041
3042                 t = propagate_types(cs->forpart, c, ok, Tnone, 0);
3043                 if (!type_compat(Tnone, t, 0))
3044                         *ok = 0;
3045                 t = propagate_types(cs->dopart, c, ok, Tnone, 0);
3046                 if (!type_compat(Tnone, t, 0))
3047                         *ok = 0;
3048                 if (cs->dopart) {
3049                         t = propagate_types(cs->thenpart, c, ok, Tnone, 0);
3050                         if (!type_compat(Tnone, t, 0))
3051                                 *ok = 0;
3052                 }
3053                 if (cs->casepart == NULL)
3054                         propagate_types(cs->condpart, c, ok, Tbool, 0);
3055                 else {
3056                         /* Condpart must match case values, with bool permitted */
3057                         t = NULL;
3058                         for (cp = cs->casepart;
3059                              cp && !t; cp = cp->next)
3060                                 t = propagate_types(cp->value, c, ok, NULL, 0);
3061                         if (!t && cs->condpart)
3062                                 t = propagate_types(cs->condpart, c, ok, NULL, Rboolok);
3063                         // Now we have a type (I hope) push it down
3064                         if (t) {
3065                                 for (cp = cs->casepart; cp; cp = cp->next)
3066                                         propagate_types(cp->value, c, ok, t, 0);
3067                                 propagate_types(cs->condpart, c, ok, t, Rboolok);
3068                         }
3069                 }
3070                 // (if)then, else, and case parts must return expected type.
3071                 if (!cs->dopart && !type)
3072                         type = propagate_types(cs->thenpart, c, ok, NULL, rules);
3073                 if (!type)
3074                         type = propagate_types(cs->elsepart, c, ok, NULL, rules);
3075                 for (cp = cs->casepart;
3076                      cp && !type;
3077                      cp = cp->next)
3078                         type = propagate_types(cp->action, c, ok, NULL, rules);
3079                 if (type) {
3080                         if (!cs->dopart)
3081                                 propagate_types(cs->thenpart, c, ok, type, rules);
3082                         propagate_types(cs->elsepart, c, ok, type, rules);
3083                         for (cp = cs->casepart; cp ; cp = cp->next)
3084                                 propagate_types(cp->action, c, ok, type, rules);
3085                         return type;
3086                 } else
3087                         return NULL;
3088         }
3089
3090 ###### interp exec cases
3091         case Xcond_statement:
3092         {
3093                 struct value v, cnd;
3094                 struct casepart *cp;
3095                 struct cond_statement *c = cast(cond_statement, e);
3096
3097                 if (c->forpart)
3098                         interp_exec(c->forpart);
3099                 do {
3100                         if (c->condpart)
3101                                 cnd = interp_exec(c->condpart);
3102                         else
3103                                 cnd.type = Tnone;
3104                         if (!(cnd.type == Tnone ||
3105                               (cnd.type == Tbool && cnd.bool != 0)))
3106                                 break;
3107                         // cnd is Tnone or Tbool, doesn't need to be freed
3108                         if (c->dopart)
3109                                 interp_exec(c->dopart);
3110
3111                         if (c->thenpart) {
3112                                 v = interp_exec(c->thenpart);
3113                                 if (v.type != Tnone || !c->dopart)
3114                                         return v;
3115                                 free_value(v);
3116                         }
3117                 } while (c->dopart);
3118
3119                 for (cp = c->casepart; cp; cp = cp->next) {
3120                         v = interp_exec(cp->value);
3121                         if (value_cmp(v, cnd) == 0) {
3122                                 free_value(v);
3123                                 free_value(cnd);
3124                                 return interp_exec(cp->action);
3125                         }
3126                         free_value(v);
3127                 }
3128                 free_value(cnd);
3129                 if (c->elsepart)
3130                         return interp_exec(c->elsepart);
3131                 v.type = Tnone;
3132                 return v;
3133         }
3134
3135 ### Finally the whole program.
3136
3137 Somewhat reminiscent of Pascal a (current) Ocean program starts with
3138 the keyword "program" and a list of variable names which are assigned
3139 values from command line arguments.  Following this is a `block` which
3140 is the code to execute.
3141
3142 As this is the top level, several things are handled a bit
3143 differently.
3144 The whole program is not interpreted by `interp_exec` as that isn't
3145 passed the argument list which the program requires.  Similarly type
3146 analysis is a bit more interesting at this level.
3147
3148 ###### Binode types
3149         Program,
3150
3151 ###### Parser: grammar
3152
3153         $*binode
3154         Program -> program OpenScope Varlist Block OptNL ${
3155                 $0 = new(binode);
3156                 $0->op = Program;
3157                 $0->left = reorder_bilist($<3);
3158                 $0->right = $<4;
3159                 var_block_close(config2context(config), CloseSequential);
3160                 if (config2context(config)->scope_stack) abort();
3161                 }$
3162                 | ERROR ${
3163                         tok_err(config2context(config),
3164                                 "error: unhandled parse error", &$1);
3165                 }$
3166
3167         Varlist -> Varlist ArgDecl ${
3168                         $0 = new(binode);
3169                         $0->op = Program;
3170                         $0->left = $<1;
3171                         $0->right = $<2;
3172                 }$
3173                 | ${ $0 = NULL; }$
3174
3175         $*var
3176         ArgDecl -> IDENTIFIER ${ {
3177                 struct variable *v = var_decl(config2context(config), $1.txt);
3178                 $0 = new(var);
3179                 $0->var = v;
3180         } }$
3181
3182         ## Grammar
3183
3184 ###### print binode cases
3185         case Program:
3186                 do_indent(indent, "program");
3187                 for (b2 = cast(binode, b->left); b2; b2 = cast(binode, b2->right)) {
3188                         printf(" ");
3189                         print_exec(b2->left, 0, 0);
3190                 }
3191                 if (bracket)
3192                         printf(" {\n");
3193                 else
3194                         printf(":\n");
3195                 print_exec(b->right, indent+1, bracket);
3196                 if (bracket)
3197                         do_indent(indent, "}\n");
3198                 break;
3199
3200 ###### propagate binode cases
3201         case Program: abort();
3202
3203 ###### core functions
3204
3205         static int analyse_prog(struct exec *prog, struct parse_context *c)
3206         {
3207                 struct binode *b = cast(binode, prog);
3208                 int ok = 1;
3209
3210                 if (!b)
3211                         return 0;
3212                 do {
3213                         ok = 1;
3214                         propagate_types(b->right, c, &ok, Tnone, 0);
3215                 } while (ok == 2);
3216                 if (!ok)
3217                         return 0;
3218
3219                 for (b = cast(binode, b->left); b; b = cast(binode, b->right)) {
3220                         struct var *v = cast(var, b->left);
3221                         if (!v->var->val.type) {
3222                                 v->var->where_set = b;
3223                                 v->var->val = val_prepare(Tstr);
3224                         }
3225                 }
3226                 b = cast(binode, prog);
3227                 do {
3228                         ok = 1;
3229                         propagate_types(b->right, c, &ok, Tnone, 0);
3230                 } while (ok == 2);
3231                 if (!ok)
3232                         return 0;
3233
3234                 /* Make sure everything is still consistent */
3235                 propagate_types(b->right, c, &ok, Tnone, 0);
3236                 return !!ok;
3237         }
3238
3239         static void interp_prog(struct exec *prog, char **argv)
3240         {
3241                 struct binode *p = cast(binode, prog);
3242                 struct binode *al;
3243                 struct value v;
3244
3245                 if (!prog)
3246                         return;
3247                 al = cast(binode, p->left);
3248                 while (al) {
3249                         struct var *v = cast(var, al->left);
3250                         struct value *vl = &v->var->val;
3251
3252                         if (argv[0] == NULL) {
3253                                 printf("Not enough args\n");
3254                                 exit(1);
3255                         }
3256                         al = cast(binode, al->right);
3257                         free_value(*vl);
3258                         *vl = parse_value(vl->type, argv[0]);
3259                         if (vl->type == NULL)
3260                                 exit(1);
3261                         argv++;
3262                 }
3263                 v = interp_exec(p->right);
3264                 free_value(v);
3265         }
3266
3267 ###### interp binode cases
3268         case Program: abort();
3269
3270 ## And now to test it out.
3271
3272 Having a language requires having a "hello world" program. I'll
3273 provide a little more than that: a program that prints "Hello world"
3274 finds the GCD of two numbers, prints the first few elements of
3275 Fibonacci, and performs a binary search for a number.
3276
3277 ###### File: oceani.mk
3278         tests :: sayhello
3279         sayhello : oceani
3280                 @echo "===== TEST ====="
3281                 ./oceani --section "test: hello" oceani.mdc 55 33
3282
3283 ###### test: hello
3284
3285         program A B:
3286                 print "Hello World, what lovely oceans you have!"
3287                 /* When a variable is defined in both branches of an 'if',
3288                  * and used afterwards, the variables are merged.
3289                  */
3290                 if A > B:
3291                         bigger := "yes"
3292                 else:
3293                         bigger := "no"
3294                 print "Is", A, "bigger than", B,"? ", bigger
3295                 /* If a variable is not used after the 'if', no
3296                  * merge happens, so types can be different
3297                  */
3298                 if A * 2 > B:
3299                         double:string = "yes"
3300                         print A, "is more than twice", B, "?", double
3301                 else:
3302                         double := A*2
3303                         print "double", A, "is only", double
3304
3305                 a : number
3306                 a = A;
3307                 b:number = B
3308                 if a > 0 and b > 0:
3309                         while a != b:
3310                                 if a < b:
3311                                         b = b - a
3312                                 else:
3313                                         a = a - b
3314                         print "GCD of", A, "and", B,"is", a
3315                 else if a <= 0:
3316                         print a, "is not positive, cannot calculate GCD"
3317                 else:
3318                         print b, "is not positive, cannot calculate GCD"
3319
3320                 for:
3321                         togo := 10
3322                         f1 := 1; f2 := 1
3323                         print "Fibonacci:", f1,f2,
3324                 then togo = togo - 1
3325                 while togo > 0:
3326                         f3 := f1 + f2
3327                         print "", f3,
3328                         f1 = f2
3329                         f2 = f3
3330                 print ""
3331
3332                 /* Binary search... */
3333                 for:
3334                         lo:= 0; hi := 100
3335                         target := 77
3336                 while:
3337                         mid := (lo + hi) / 2
3338                         if mid == target:
3339                                 use Found
3340                         if mid < target:
3341                                 lo = mid
3342                         else:
3343                                 hi = mid
3344                         if hi - lo < 1:
3345                                 use GiveUp
3346                         use True
3347                 do: pass
3348                 case Found:
3349                         print "Yay, I found", target
3350                 case GiveUp:
3351                         print "Closest I found was", mid