]> ocean-lang.org Git - ocean/blob - csrc/oceani.mdc
oceani: fix up test program.
[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, Rnoconstant = 2<<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->constant && (rules & Rnoconstant)) {
1769                         type_err(c, "error: Cannot assign to a constant: %v",
1770                                  prog, NULL, 0, NULL);
1771                         type_err(c, "info: name was defined as a constant here",
1772                                  v->where_decl, NULL, 0, NULL);
1773                         *ok = 0;
1774                         return v->val.type;
1775                 }
1776                 if (v->val.type == NULL) {
1777                         if (type && *ok != 0) {
1778                                 v->val = val_prepare(type);
1779                                 v->where_set = prog;
1780                                 *ok = 2;
1781                         }
1782                         return type;
1783                 }
1784                 if (!type_compat(type, v->val.type, rules)) {
1785                         type_err(c, "error: expected %1%r but variable '%v' is %2", prog,
1786                                  type, rules, v->val.type);
1787                         type_err(c, "info: this is where '%v' was set to %1", v->where_set,
1788                                  v->val.type, rules, Tnone);
1789                         *ok = 0;
1790                 }
1791                 if (!type)
1792                         return v->val.type;
1793                 return type;
1794         }
1795
1796 ###### interp exec cases
1797         case Xvar:
1798         {
1799                 struct var *var = cast(var, e);
1800                 struct variable *v = var->var;
1801
1802                 if (v->merged)
1803                         v = v->merged;
1804                 return dup_value(v->val);
1805         }
1806
1807 ###### ast functions
1808
1809         static void free_var(struct var *v)
1810         {
1811                 free(v);
1812         }
1813
1814 ###### free exec cases
1815         case Xvar: free_var(cast(var, e)); break;
1816
1817 ### Expressions: Boolean
1818
1819 Our first user of the `binode` will be expressions, and particularly
1820 Boolean expressions.  As I haven't implemented precedence in the
1821 parser generator yet, we need different names for each precedence
1822 level used by expressions.  The outer most or lowest level precedence
1823 are Boolean `or` `and`, and `not` which form an `Expression` out of `BTerm`s
1824 and `BFact`s.
1825
1826 ###### Binode types
1827         And,
1828         Or,
1829         Not,
1830
1831 ###### Grammar
1832
1833         $*exec
1834         Expression -> Expression or BTerm ${ {
1835                         struct binode *b = new(binode);
1836                         b->op = Or;
1837                         b->left = $<1;
1838                         b->right = $<3;
1839                         $0 = b;
1840                 } }$
1841                 | BTerm ${ $0 = $<1; }$
1842
1843         BTerm -> BTerm and BFact ${ {
1844                         struct binode *b = new(binode);
1845                         b->op = And;
1846                         b->left = $<1;
1847                         b->right = $<3;
1848                         $0 = b;
1849                 } }$
1850                 | BFact ${ $0 = $<1; }$
1851
1852         BFact -> not BFact ${ {
1853                         struct binode *b = new(binode);
1854                         b->op = Not;
1855                         b->right = $<2;
1856                         $0 = b;
1857                 } }$
1858                 ## other BFact
1859
1860 ###### print binode cases
1861         case And:
1862                 print_exec(b->left, -1, 0);
1863                 printf(" and ");
1864                 print_exec(b->right, -1, 0);
1865                 break;
1866         case Or:
1867                 print_exec(b->left, -1, 0);
1868                 printf(" or ");
1869                 print_exec(b->right, -1, 0);
1870                 break;
1871         case Not:
1872                 printf("not ");
1873                 print_exec(b->right, -1, 0);
1874                 break;
1875
1876 ###### propagate binode cases
1877         case And:
1878         case Or:
1879         case Not:
1880                 /* both must be Tbool, result is Tbool */
1881                 propagate_types(b->left, c, ok, Tbool, 0);
1882                 propagate_types(b->right, c, ok, Tbool, 0);
1883                 if (type && type != Tbool) {
1884                         type_err(c, "error: %1 operation found where %2 expected", prog,
1885                                    Tbool, 0, type);
1886                         *ok = 0;
1887                 }
1888                 return Tbool;
1889
1890 ###### interp binode cases
1891         case And:
1892                 rv = interp_exec(b->left);
1893                 right = interp_exec(b->right);
1894                 rv.bool = rv.bool && right.bool;
1895                 break;
1896         case Or:
1897                 rv = interp_exec(b->left);
1898                 right = interp_exec(b->right);
1899                 rv.bool = rv.bool || right.bool;
1900                 break;
1901         case Not:
1902                 rv = interp_exec(b->right);
1903                 rv.bool = !rv.bool;
1904                 break;
1905
1906 ### Expressions: Comparison
1907
1908 Of slightly higher precedence that Boolean expressions are
1909 Comparisons.
1910 A comparison takes arguments of any type, but the two types must be
1911 the same.
1912
1913 To simplify the parsing we introduce an `eop` which can record an
1914 expression operator.
1915
1916 ###### ast
1917         struct eop {
1918                 enum Btype op;
1919         };
1920
1921 ###### ast functions
1922         static void free_eop(struct eop *e)
1923         {
1924                 if (e)
1925                         free(e);
1926         }
1927
1928 ###### Binode types
1929         Less,
1930         Gtr,
1931         LessEq,
1932         GtrEq,
1933         Eql,
1934         NEql,
1935
1936 ###### other BFact
1937         | Expr CMPop Expr ${ {
1938                         struct binode *b = new(binode);
1939                         b->op = $2.op;
1940                         b->left = $<1;
1941                         b->right = $<3;
1942                         $0 = b;
1943         } }$
1944         | Expr ${ $0 = $<1; }$
1945
1946 ###### Grammar
1947
1948         $eop
1949         CMPop ->   < ${ $0.op = Less; }$
1950                 |  > ${ $0.op = Gtr; }$
1951                 |  <= ${ $0.op = LessEq; }$
1952                 |  >= ${ $0.op = GtrEq; }$
1953                 |  == ${ $0.op = Eql; }$
1954                 |  != ${ $0.op = NEql; }$
1955
1956 ###### print binode cases
1957
1958         case Less:
1959         case LessEq:
1960         case Gtr:
1961         case GtrEq:
1962         case Eql:
1963         case NEql:
1964                 print_exec(b->left, -1, 0);
1965                 switch(b->op) {
1966                 case Less:   printf(" < "); break;
1967                 case LessEq: printf(" <= "); break;
1968                 case Gtr:    printf(" > "); break;
1969                 case GtrEq:  printf(" >= "); break;
1970                 case Eql:    printf(" == "); break;
1971                 case NEql:   printf(" != "); break;
1972                 default: abort();
1973                 }
1974                 print_exec(b->right, -1, 0);
1975                 break;
1976
1977 ###### propagate binode cases
1978         case Less:
1979         case LessEq:
1980         case Gtr:
1981         case GtrEq:
1982         case Eql:
1983         case NEql:
1984                 /* Both must match but not be labels, result is Tbool */
1985                 t = propagate_types(b->left, c, ok, NULL, Rnolabel);
1986                 if (t)
1987                         propagate_types(b->right, c, ok, t, 0);
1988                 else {
1989                         t = propagate_types(b->right, c, ok, NULL, Rnolabel);
1990                         if (t)
1991                                 t = propagate_types(b->left, c, ok, t, 0);
1992                 }
1993                 if (!type_compat(type, Tbool, 0)) {
1994                         type_err(c, "error: Comparison returns %1 but %2 expected", prog,
1995                                     Tbool, rules, type);
1996                         *ok = 0;
1997                 }
1998                 return Tbool;
1999
2000 ###### interp binode cases
2001         case Less:
2002         case LessEq:
2003         case Gtr:
2004         case GtrEq:
2005         case Eql:
2006         case NEql:
2007         {
2008                 int cmp;
2009                 left = interp_exec(b->left);
2010                 right = interp_exec(b->right);
2011                 cmp = value_cmp(left, right);
2012                 rv.type = Tbool;
2013                 switch (b->op) {
2014                 case Less:      rv.bool = cmp <  0; break;
2015                 case LessEq:    rv.bool = cmp <= 0; break;
2016                 case Gtr:       rv.bool = cmp >  0; break;
2017                 case GtrEq:     rv.bool = cmp >= 0; break;
2018                 case Eql:       rv.bool = cmp == 0; break;
2019                 case NEql:      rv.bool = cmp != 0; break;
2020                 default: rv.bool = 0; break;
2021                 }
2022                 break;
2023         }
2024
2025 ### Expressions: The rest
2026
2027 The remaining expressions with the highest precedence are arithmetic
2028 and string concatenation.  They are `Expr`, `Term`, and `Factor`.
2029 The `Factor` is where the `Value` and `Variable` that we already have
2030 are included.
2031
2032 `+` and `-` are both infix and prefix operations (where they are
2033 absolute value and negation).  These have different operator names.
2034
2035 We also have a 'Bracket' operator which records where parentheses were
2036 found.  This makes it easy to reproduce these when printing.  Once
2037 precedence is handled better I might be able to discard this.
2038
2039 ###### Binode types
2040         Plus, Minus,
2041         Times, Divide,
2042         Concat,
2043         Absolute, Negate,
2044         Bracket,
2045
2046 ###### Grammar
2047
2048         $*exec
2049         Expr -> Expr Eop Term ${ {
2050                         struct binode *b = new(binode);
2051                         b->op = $2.op;
2052                         b->left = $<1;
2053                         b->right = $<3;
2054                         $0 = b;
2055                 } }$
2056                 | Term ${ $0 = $<1; }$
2057
2058         Term -> Term Top Factor ${ {
2059                         struct binode *b = new(binode);
2060                         b->op = $2.op;
2061                         b->left = $<1;
2062                         b->right = $<3;
2063                         $0 = b;
2064                 } }$
2065                 | Factor ${ $0 = $<1; }$
2066
2067         Factor -> ( Expression ) ${ {
2068                         struct binode *b = new_pos(binode, $1);
2069                         b->op = Bracket;
2070                         b->right = $<2;
2071                         $0 = b;
2072                 } }$
2073                 | Uop Factor ${ {
2074                         struct binode *b = new(binode);
2075                         b->op = $1.op;
2076                         b->right = $<2;
2077                         $0 = b;
2078                 } }$
2079                 | Value ${ $0 = $<1; }$
2080                 | Variable ${ $0 = $<1; }$
2081
2082         $eop
2083         Eop ->    + ${ $0.op = Plus; }$
2084                 | - ${ $0.op = Minus; }$
2085
2086         Uop ->    + ${ $0.op = Absolute; }$
2087                 | - ${ $0.op = Negate; }$
2088
2089         Top ->    * ${ $0.op = Times; }$
2090                 | / ${ $0.op = Divide; }$
2091                 | ++ ${ $0.op = Concat; }$
2092
2093 ###### print binode cases
2094         case Plus:
2095         case Minus:
2096         case Times:
2097         case Divide:
2098         case Concat:
2099                 print_exec(b->left, indent, 0);
2100                 switch(b->op) {
2101                 case Plus:   printf(" + "); break;
2102                 case Minus:  printf(" - "); break;
2103                 case Times:  printf(" * "); break;
2104                 case Divide: printf(" / "); break;
2105                 case Concat: printf(" ++ "); break;
2106                 default: abort();
2107                 }
2108                 print_exec(b->right, indent, 0);
2109                 break;
2110         case Absolute:
2111                 printf("+");
2112                 print_exec(b->right, indent, 0);
2113                 break;
2114         case Negate:
2115                 printf("-");
2116                 print_exec(b->right, indent, 0);
2117                 break;
2118         case Bracket:
2119                 printf("(");
2120                 print_exec(b->right, indent, 0);
2121                 printf(")");
2122                 break;
2123
2124 ###### propagate binode cases
2125         case Plus:
2126         case Minus:
2127         case Times:
2128         case Divide:
2129                 /* both must be numbers, result is Tnum */
2130         case Absolute:
2131         case Negate:
2132                 /* as propagate_types ignores a NULL,
2133                  * unary ops fit here too */
2134                 propagate_types(b->left, c, ok, Tnum, 0);
2135                 propagate_types(b->right, c, ok, Tnum, 0);
2136                 if (!type_compat(type, Tnum, 0)) {
2137                         type_err(c, "error: Arithmetic returns %1 but %2 expected", prog,
2138                                    Tnum, rules, type);
2139                         *ok = 0;
2140                 }
2141                 return Tnum;
2142
2143         case Concat:
2144                 /* both must be Tstr, result is Tstr */
2145                 propagate_types(b->left, c, ok, Tstr, 0);
2146                 propagate_types(b->right, c, ok, Tstr, 0);
2147                 if (!type_compat(type, Tstr, 0)) {
2148                         type_err(c, "error: Concat returns %1 but %2 expected", prog,
2149                                    Tstr, rules, type);
2150                         *ok = 0;
2151                 }
2152                 return Tstr;
2153
2154         case Bracket:
2155                 return propagate_types(b->right, c, ok, type, 0);
2156
2157 ###### interp binode cases
2158
2159         case Plus:
2160                 rv = interp_exec(b->left);
2161                 right = interp_exec(b->right);
2162                 mpq_add(rv.num, rv.num, right.num);
2163                 break;
2164         case Minus:
2165                 rv = interp_exec(b->left);
2166                 right = interp_exec(b->right);
2167                 mpq_sub(rv.num, rv.num, right.num);
2168                 break;
2169         case Times:
2170                 rv = interp_exec(b->left);
2171                 right = interp_exec(b->right);
2172                 mpq_mul(rv.num, rv.num, right.num);
2173                 break;
2174         case Divide:
2175                 rv = interp_exec(b->left);
2176                 right = interp_exec(b->right);
2177                 mpq_div(rv.num, rv.num, right.num);
2178                 break;
2179         case Negate:
2180                 rv = interp_exec(b->right);
2181                 mpq_neg(rv.num, rv.num);
2182                 break;
2183         case Absolute:
2184                 rv = interp_exec(b->right);
2185                 mpq_abs(rv.num, rv.num);
2186                 break;
2187         case Bracket:
2188                 rv = interp_exec(b->right);
2189                 break;
2190         case Concat:
2191                 left = interp_exec(b->left);
2192                 right = interp_exec(b->right);
2193                 rv.type = Tstr;
2194                 rv.str = text_join(left.str, right.str);
2195                 break;
2196
2197
2198 ###### value functions
2199
2200         static struct text text_join(struct text a, struct text b)
2201         {
2202                 struct text rv;
2203                 rv.len = a.len + b.len;
2204                 rv.txt = malloc(rv.len);
2205                 memcpy(rv.txt, a.txt, a.len);
2206                 memcpy(rv.txt+a.len, b.txt, b.len);
2207                 return rv;
2208         }
2209
2210
2211 ### Blocks, Statements, and Statement lists.
2212
2213 Now that we have expressions out of the way we need to turn to
2214 statements.  There are simple statements and more complex statements.
2215 Simple statements do not contain newlines, complex statements do.
2216
2217 Statements often come in sequences and we have corresponding simple
2218 statement lists and complex statement lists.
2219 The former comprise only simple statements separated by semicolons.
2220 The later comprise complex statements and simple statement lists.  They are
2221 separated by newlines.  Thus the semicolon is only used to separate
2222 simple statements on the one line.  This may be overly restrictive,
2223 but I'm not sure I ever want a complex statement to share a line with
2224 anything else.
2225
2226 Note that a simple statement list can still use multiple lines if
2227 subsequent lines are indented, so
2228
2229 ###### Example: wrapped simple statement list
2230
2231         a = b; c = d;
2232            e = f; print g
2233
2234 is a single simple statement list.  This might allow room for
2235 confusion, so I'm not set on it yet.
2236
2237 A simple statement list needs no extra syntax.  A complex statement
2238 list has two syntactic forms.  It can be enclosed in braces (much like
2239 C blocks), or it can be introduced by a colon and continue until an
2240 unindented newline (much like Python blocks).  With this extra syntax
2241 it is referred to as a block.
2242
2243 Note that a block does not have to include any newlines if it only
2244 contains simple statements.  So both of:
2245
2246         if condition: a=b; d=f
2247
2248         if condition { a=b; print f }
2249
2250 are valid.
2251
2252 In either case the list is constructed from a `binode` list with
2253 `Block` as the operator.  When parsing the list it is most convenient
2254 to append to the end, so a list is a list and a statement.  When using
2255 the list it is more convenient to consider a list to be a statement
2256 and a list.  So we need a function to re-order a list.
2257 `reorder_bilist` serves this purpose.
2258
2259 The only stand-alone statement we introduce at this stage is `pass`
2260 which does nothing and is represented as a `NULL` pointer in a `Block`
2261 list.  Other stand-alone statements will follow once the infrastructure
2262 is in-place.
2263
2264 ###### Binode types
2265         Block,
2266
2267 ###### Grammar
2268
2269         $void
2270         OptNL -> Newlines
2271                 |
2272
2273         Newlines -> NEWLINE
2274                 | Newlines NEWLINE
2275
2276         $*binode
2277         Open -> {
2278                 | NEWLINE {
2279         Close -> }
2280                 | NEWLINE }
2281         Block -> Open Statementlist Close ${ $0 = $<2; }$
2282                 | Open Newlines Statementlist Close ${ $0 = $<3; }$
2283                 | Open SimpleStatements } ${ $0 = reorder_bilist($<2); }$
2284                 | Open Newlines SimpleStatements } ${ $0 = reorder_bilist($<3); }$
2285                 | : Statementlist ${ $0 = $<2; }$
2286                 | : SimpleStatements ${ $0 = reorder_bilist($<2); }$
2287
2288         Statementlist -> ComplexStatements ${ $0 = reorder_bilist($<1); }$
2289
2290         ComplexStatements -> ComplexStatements ComplexStatement ${
2291                 $0 = new(binode);
2292                 $0->op = Block;
2293                 $0->left = $<1;
2294                 $0->right = $<2;
2295                 }$
2296                 | ComplexStatements NEWLINE ${ $0 = $<1; }$
2297                 | ComplexStatement ${
2298                 $0 = new(binode);
2299                 $0->op = Block;
2300                 $0->left = NULL;
2301                 $0->right = $<1;
2302                 }$
2303
2304         $*exec
2305         ComplexStatement -> SimpleStatements NEWLINE ${
2306                         $0 = reorder_bilist($<1);
2307                         }$
2308                 ## ComplexStatement Grammar
2309
2310         $*binode
2311         SimpleStatements -> SimpleStatements ; SimpleStatement ${
2312                         $0 = new(binode);
2313                         $0->op = Block;
2314                         $0->left = $<1;
2315                         $0->right = $<3;
2316                         }$
2317                 | SimpleStatement ${
2318                         $0 = new(binode);
2319                         $0->op = Block;
2320                         $0->left = NULL;
2321                         $0->right = $<1;
2322                         }$
2323                 | SimpleStatements ; ${ $0 = $<1; }$
2324
2325         SimpleStatement -> pass ${ $0 = NULL; }$
2326                 ## SimpleStatement Grammar
2327
2328 ###### print binode cases
2329         case Block:
2330                 if (indent < 0) {
2331                         // simple statement
2332                         if (b->left == NULL)
2333                                 printf("pass");
2334                         else
2335                                 print_exec(b->left, indent, 0);
2336                         if (b->right) {
2337                                 printf("; ");
2338                                 print_exec(b->right, indent, 0);
2339                         }
2340                 } else {
2341                         // block, one per line
2342                         if (b->left == NULL)
2343                                 do_indent(indent, "pass\n");
2344                         else
2345                                 print_exec(b->left, indent, bracket);
2346                         if (b->right)
2347                                 print_exec(b->right, indent, bracket);
2348                 }
2349                 break;
2350
2351 ###### propagate binode cases
2352         case Block:
2353         {
2354                 /* If any statement returns something other than Tnone
2355                  * or Tbool then all such must return same type.
2356                  * As each statement may be Tnone or something else,
2357                  * we must always pass NULL (unknown) down, otherwise an incorrect
2358                  * error might occur.  We never return Tnone unless it is
2359                  * passed in.
2360                  */
2361                 struct binode *e;
2362
2363                 for (e = b; e; e = cast(binode, e->right)) {
2364                         t = propagate_types(e->left, c, ok, NULL, rules);
2365                         if ((rules & Rboolok) && t == Tbool)
2366                                 t = NULL;
2367                         if (t && t != Tnone && t != Tbool) {
2368                                 if (!type)
2369                                         type = t;
2370                                 else if (t != type) {
2371                                         type_err(c, "error: expected %1%r, found %2",
2372                                                  e->left, type, rules, t);
2373                                         *ok = 0;
2374                                 }
2375                         }
2376                 }
2377                 return type;
2378         }
2379
2380 ###### interp binode cases
2381         case Block:
2382                 while (rv.type == Tnone &&
2383                        b) {
2384                         if (b->left)
2385                                 rv = interp_exec(b->left);
2386                         b = cast(binode, b->right);
2387                 }
2388                 break;
2389
2390 ### The Print statement
2391
2392 `print` is a simple statement that takes a comma-separated list of
2393 expressions and prints the values separated by spaces and terminated
2394 by a newline.  No control of formatting is possible.
2395
2396 `print` faces the same list-ordering issue as blocks, and uses the
2397 same solution.
2398
2399 ###### Binode types
2400         Print,
2401
2402 ###### SimpleStatement Grammar
2403
2404         | print ExpressionList ${
2405                 $0 = reorder_bilist($<2);
2406         }$
2407         | print ExpressionList , ${
2408                 $0 = new(binode);
2409                 $0->op = Print;
2410                 $0->right = NULL;
2411                 $0->left = $<2;
2412                 $0 = reorder_bilist($0);
2413         }$
2414         | print ${
2415                 $0 = new(binode);
2416                 $0->op = Print;
2417                 $0->right = NULL;
2418         }$
2419
2420 ###### Grammar
2421
2422         $*binode
2423         ExpressionList -> ExpressionList , Expression ${
2424                 $0 = new(binode);
2425                 $0->op = Print;
2426                 $0->left = $<1;
2427                 $0->right = $<3;
2428                 }$
2429                 | Expression ${
2430                         $0 = new(binode);
2431                         $0->op = Print;
2432                         $0->left = NULL;
2433                         $0->right = $<1;
2434                 }$
2435
2436 ###### print binode cases
2437
2438         case Print:
2439                 do_indent(indent, "print");
2440                 while (b) {
2441                         if (b->left) {
2442                                 printf(" ");
2443                                 print_exec(b->left, -1, 0);
2444                                 if (b->right)
2445                                         printf(",");
2446                         }
2447                         b = cast(binode, b->right);
2448                 }
2449                 if (indent >= 0)
2450                         printf("\n");
2451                 break;
2452
2453 ###### propagate binode cases
2454
2455         case Print:
2456                 /* don't care but all must be consistent */
2457                 propagate_types(b->left, c, ok, NULL, Rnolabel);
2458                 propagate_types(b->right, c, ok, NULL, Rnolabel);
2459                 break;
2460
2461 ###### interp binode cases
2462
2463         case Print:
2464         {
2465                 char sep = 0;
2466                 int eol = 1;
2467                 for ( ; b; b = cast(binode, b->right))
2468                         if (b->left) {
2469                                 if (sep)
2470                                         putchar(sep);
2471                                 left = interp_exec(b->left);
2472                                 print_value(left);
2473                                 free_value(left);
2474                                 if (b->right)
2475                                         sep = ' ';
2476                         } else if (sep)
2477                                 eol = 0;
2478                 left.type = Tnone;
2479                 if (eol)
2480                         printf("\n");
2481                 break;
2482         }
2483
2484 ###### Assignment statement
2485
2486 An assignment will assign a value to a variable, providing it hasn't
2487 be declared as a constant.  The analysis phase ensures that the type
2488 will be correct so the interpreter just needs to perform the
2489 calculation.  There is a form of assignment which declares a new
2490 variable as well as assigning a value.  If a name is assigned before
2491 it is declared, and error will be raised as the name is created as
2492 `Tlabel` and it is illegal to assign to such names.
2493
2494 ###### Binode types
2495         Assign,
2496         Declare,
2497
2498 ###### SimpleStatement Grammar
2499         | Variable = Expression ${
2500                         $0 = new(binode);
2501                         $0->op = Assign;
2502                         $0->left = $<1;
2503                         $0->right = $<3;
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                  * For Assign, left must not be constant.
2571                  * result is Tnone
2572                  */
2573                 t = propagate_types(b->left, c, ok, NULL,
2574                                     Rnolabel | (b->op == Assign ? Rnoconstant : 0));
2575                 if (!b->right)
2576                         return Tnone;
2577
2578                 if (t) {
2579                         if (propagate_types(b->right, c, ok, t, 0) != t)
2580                                 if (b->left->type == Xvar)
2581                                         type_err(c, "info: variable '%v' was set as %1 here.",
2582                                                  cast(var, b->left)->var->where_set, t, rules, Tnone);
2583                 } else {
2584                         t = propagate_types(b->right, c, ok, NULL, Rnolabel);
2585                         if (t)
2586                                 propagate_types(b->left, c, ok, t,
2587                                                 (b->op == Assign ? Rnoconstant : 0));
2588                 }
2589                 if (t && t->dup == NULL) {
2590                         type_err(c, "error: cannot assign value of type %1", b, t, 0, NULL);
2591                         *ok = 0;
2592                 }
2593                 return Tnone;
2594
2595                 break;
2596
2597 ###### interp binode cases
2598
2599         case Assign:
2600         {
2601                 struct variable *v = cast(var, b->left)->var;
2602                 if (v->merged)
2603                         v = v->merged;
2604                 right = interp_exec(b->right);
2605                 free_value(v->val);
2606                 v->val = right;
2607                 right.type = NULL;
2608                 break;
2609         }
2610
2611         case Declare:
2612         {
2613                 struct variable *v = cast(var, b->left)->var;
2614                 if (v->merged)
2615                         v = v->merged;
2616                 if (b->right)
2617                         right = interp_exec(b->right);
2618                 else
2619                         right = val_init(v->val.type);
2620                 free_value(v->val);
2621                 v->val = right;
2622                 right.type = NULL;
2623                 break;
2624         }
2625
2626 ### The `use` statement
2627
2628 The `use` statement is the last "simple" statement.  It is needed when
2629 the condition in a conditional statement is a block.  `use` works much
2630 like `return` in C, but only completes the `condition`, not the whole
2631 function.
2632
2633 ###### Binode types
2634         Use,
2635
2636 ###### SimpleStatement Grammar
2637         | use Expression ${
2638                 $0 = new_pos(binode, $1);
2639                 $0->op = Use;
2640                 $0->right = $<2;
2641         }$
2642
2643 ###### print binode cases
2644
2645         case Use:
2646                 do_indent(indent, "use ");
2647                 print_exec(b->right, -1, 0);
2648                 if (indent >= 0)
2649                         printf("\n");
2650                 break;
2651
2652 ###### propagate binode cases
2653
2654         case Use:
2655                 /* result matches value */
2656                 return propagate_types(b->right, c, ok, type, 0);
2657
2658 ###### interp binode cases
2659
2660         case Use:
2661                 rv = interp_exec(b->right);
2662                 break;
2663
2664 ### The Conditional Statement
2665
2666 This is the biggy and currently the only complex statement.  This
2667 subsumes `if`, `while`, `do/while`, `switch`, and some parts of `for`.
2668 It is comprised of a number of parts, all of which are optional though
2669 set combinations apply.  Each part is (usually) a key word (`then` is
2670 sometimes optional) followed by either an expression or a code block,
2671 except the `casepart` which is a "key word and an expression" followed
2672 by a code block.  The code-block option is valid for all parts and,
2673 where an expression is also allowed, the code block can use the `use`
2674 statement to report a value.  If the code block does not report a value
2675 the effect is similar to reporting `True`.
2676
2677 The `else` and `case` parts, as well as `then` when combined with
2678 `if`, can contain a `use` statement which will apply to some
2679 containing conditional statement. `for` parts, `do` parts and `then`
2680 parts used with `for` can never contain a `use`, except in some
2681 subordinate conditional statement.
2682
2683 If there is a `forpart`, it is executed first, only once.
2684 If there is a `dopart`, then it is executed repeatedly providing
2685 always that the `condpart` or `cond`, if present, does not return a non-True
2686 value.  `condpart` can fail to return any value if it simply executes
2687 to completion.  This is treated the same as returning `True`.
2688
2689 If there is a `thenpart` it will be executed whenever the `condpart`
2690 or `cond` returns True (or does not return any value), but this will happen
2691 *after* `dopart` (when present).
2692
2693 If `elsepart` is present it will be executed at most once when the
2694 condition returns `False` or some value that isn't `True` and isn't
2695 matched by any `casepart`.  If there are any `casepart`s, they will be
2696 executed when the condition returns a matching value.
2697
2698 The particular sorts of values allowed in case parts has not yet been
2699 determined in the language design, so nothing is prohibited.
2700
2701 The various blocks in this complex statement potentially provide scope
2702 for variables as described earlier.  Each such block must include the
2703 "OpenScope" nonterminal before parsing the block, and must call
2704 `var_block_close()` when closing the block.
2705
2706 The code following "`if`", "`switch`" and "`for`" does not get its own
2707 scope, but is in a scope covering the whole statement, so names
2708 declared there cannot be redeclared elsewhere.  Similarly the
2709 condition following "`while`" is in a scope the covers the body
2710 ("`do`" part) of the loop, and which does not allow conditional scope
2711 extension.  Code following "`then`" (both looping and non-looping),
2712 "`else`" and "`case`" each get their own local scope.
2713
2714 The type requirements on the code block in a `whilepart` are quite
2715 unusal.  It is allowed to return a value of some identifiable type, in
2716 which case the loop aborts and an appropriate `casepart` is run, or it
2717 can return a Boolean, in which case the loop either continues to the
2718 `dopart` (on `True`) or aborts and runs the `elsepart` (on `False`).
2719 This is different both from the `ifpart` code block which is expected to
2720 return a Boolean, or the `switchpart` code block which is expected to
2721 return the same type as the casepart values.  The correct analysis of
2722 the type of the `whilepart` code block is the reason for the
2723 `Rboolok` flag which is passed to `propagate_types()`.
2724
2725 The `cond_statement` cannot fit into a `binode` so a new `exec` is
2726 defined.
2727
2728 ###### exec type
2729         Xcond_statement,
2730
2731 ###### ast
2732         struct casepart {
2733                 struct exec *value;
2734                 struct exec *action;
2735                 struct casepart *next;
2736         };
2737         struct cond_statement {
2738                 struct exec;
2739                 struct exec *forpart, *condpart, *dopart, *thenpart, *elsepart;
2740                 struct casepart *casepart;
2741         };
2742
2743 ###### ast functions
2744
2745         static void free_casepart(struct casepart *cp)
2746         {
2747                 while (cp) {
2748                         struct casepart *t;
2749                         free_exec(cp->value);
2750                         free_exec(cp->action);
2751                         t = cp->next;
2752                         free(cp);
2753                         cp = t;
2754                 }
2755         }
2756
2757         static void free_cond_statement(struct cond_statement *s)
2758         {
2759                 if (!s)
2760                         return;
2761                 free_exec(s->forpart);
2762                 free_exec(s->condpart);
2763                 free_exec(s->dopart);
2764                 free_exec(s->thenpart);
2765                 free_exec(s->elsepart);
2766                 free_casepart(s->casepart);
2767                 free(s);
2768         }
2769
2770 ###### free exec cases
2771         case Xcond_statement: free_cond_statement(cast(cond_statement, e)); break;
2772
2773 ###### ComplexStatement Grammar
2774         | CondStatement ${ $0 = $<1; }$
2775
2776 ###### Grammar
2777
2778         $*cond_statement
2779         // both ForThen and Whilepart open scopes, and CondSuffix only
2780         // closes one - so in the first branch here we have another to close.
2781         CondStatement -> ForThen WhilePart CondSuffix ${
2782                         $0 = $<3;
2783                         $0->forpart = $1.forpart; $1.forpart = NULL;
2784                         $0->thenpart = $1.thenpart; $1.thenpart = NULL;
2785                         $0->condpart = $2.condpart; $2.condpart = NULL;
2786                         $0->dopart = $2.dopart; $2.dopart = NULL;
2787                         var_block_close(config2context(config), CloseSequential);
2788                         }$
2789                 | WhilePart CondSuffix ${
2790                         $0 = $<2;
2791                         $0->condpart = $1.condpart; $1.condpart = NULL;
2792                         $0->dopart = $1.dopart; $1.dopart = NULL;
2793                         }$
2794                 | SwitchPart CondSuffix ${
2795                         $0 = $<2;
2796                         $0->condpart = $<1;
2797                         }$
2798                 | IfPart IfSuffix ${
2799                         $0 = $<2;
2800                         $0->condpart = $1.condpart; $1.condpart = NULL;
2801                         $0->thenpart = $1.thenpart; $1.thenpart = NULL;
2802                         // This is where we close an "if" statement
2803                         var_block_close(config2context(config), CloseSequential);
2804                         }$
2805
2806         CondSuffix -> IfSuffix ${
2807                         $0 = $<1;
2808                         // This is where we close scope of the whole
2809                         // "for" or "while" statement
2810                         var_block_close(config2context(config), CloseSequential);
2811                 }$
2812                 | CasePart CondSuffix ${
2813                         $0 = $<2;
2814                         $1->next = $0->casepart;
2815                         $0->casepart = $<1;
2816                 }$
2817
2818         $*casepart
2819         CasePart -> Newlines case Expression OpenScope Block ${
2820                         $0 = calloc(1,sizeof(struct casepart));
2821                         $0->value = $<3;
2822                         $0->action = $<5;
2823                         var_block_close(config2context(config), CloseParallel);
2824                 }$
2825                 | case Expression OpenScope Block ${
2826                         $0 = calloc(1,sizeof(struct casepart));
2827                         $0->value = $<2;
2828                         $0->action = $<4;
2829                         var_block_close(config2context(config), CloseParallel);
2830                 }$
2831
2832         $*cond_statement
2833         IfSuffix -> Newlines ${ $0 = new(cond_statement); }$
2834                 | Newlines else OpenScope Block ${
2835                         $0 = new(cond_statement);
2836                         $0->elsepart = $<4;
2837                         var_block_close(config2context(config), CloseElse);
2838                 }$
2839                 | else OpenScope Block ${
2840                         $0 = new(cond_statement);
2841                         $0->elsepart = $<3;
2842                         var_block_close(config2context(config), CloseElse);
2843                 }$
2844                 | Newlines else OpenScope CondStatement ${
2845                         $0 = new(cond_statement);
2846                         $0->elsepart = $<4;
2847                         var_block_close(config2context(config), CloseElse);
2848                 }$
2849                 | else OpenScope CondStatement ${
2850                         $0 = new(cond_statement);
2851                         $0->elsepart = $<3;
2852                         var_block_close(config2context(config), CloseElse);
2853                 }$
2854
2855
2856         $*exec
2857         // These scopes are closed in CondSuffix
2858         ForPart -> for OpenScope SimpleStatements ${
2859                         $0 = reorder_bilist($<3);
2860                 }$
2861                 |  for OpenScope Block ${
2862                         $0 = $<3;
2863                 }$
2864
2865         ThenPart -> then OpenScope SimpleStatements ${
2866                         $0 = reorder_bilist($<3);
2867                         var_block_close(config2context(config), CloseSequential);
2868                 }$
2869                 |  then OpenScope Block ${
2870                         $0 = $<3;
2871                         var_block_close(config2context(config), CloseSequential);
2872                 }$
2873
2874         ThenPartNL -> ThenPart OptNL ${
2875                         $0 = $<1;
2876                 }$
2877
2878         // This scope is closed in CondSuffix
2879         WhileHead -> while OpenScope Block ${
2880                 $0 = $<3;
2881                 }$
2882
2883         $cond_statement
2884         ForThen -> ForPart OptNL ThenPartNL ${
2885                         $0.forpart = $<1;
2886                         $0.thenpart = $<3;
2887                 }$
2888                 | ForPart OptNL ${
2889                         $0.forpart = $<1;
2890                 }$
2891
2892         // This scope is closed in CondSuffix
2893         WhilePart -> while OpenScope Expression Block ${
2894                         $0.type = Xcond_statement;
2895                         $0.condpart = $<3;
2896                         $0.dopart = $<4;
2897                 }$
2898                 | WhileHead OptNL do Block ${
2899                         $0.type = Xcond_statement;
2900                         $0.condpart = $<1;
2901                         $0.dopart = $<4;
2902                 }$
2903
2904         IfPart -> if OpenScope Expression OpenScope Block ${
2905                         $0.type = Xcond_statement;
2906                         $0.condpart = $<3;
2907                         $0.thenpart = $<5;
2908                         var_block_close(config2context(config), CloseParallel);
2909                 }$
2910                 | if OpenScope Block OptNL then OpenScope Block ${
2911                         $0.type = Xcond_statement;
2912                         $0.condpart = $<3;
2913                         $0.thenpart = $<7;
2914                         var_block_close(config2context(config), CloseParallel);
2915                 }$
2916
2917         $*exec
2918         // This scope is closed in CondSuffix
2919         SwitchPart -> switch OpenScope Expression ${
2920                         $0 = $<3;
2921                 }$
2922                 | switch OpenScope Block ${
2923                         $0 = $<3;
2924                 }$
2925
2926 ###### print exec cases
2927
2928         case Xcond_statement:
2929         {
2930                 struct cond_statement *cs = cast(cond_statement, e);
2931                 struct casepart *cp;
2932                 if (cs->forpart) {
2933                         do_indent(indent, "for");
2934                         if (bracket) printf(" {\n"); else printf(":\n");
2935                         print_exec(cs->forpart, indent+1, bracket);
2936                         if (cs->thenpart) {
2937                                 if (bracket)
2938                                         do_indent(indent, "} then {\n");
2939                                 else
2940                                         do_indent(indent, "then:\n");
2941                                 print_exec(cs->thenpart, indent+1, bracket);
2942                         }
2943                         if (bracket) do_indent(indent, "}\n");
2944                 }
2945                 if (cs->dopart) {
2946                         // a loop
2947                         if (cs->condpart && cs->condpart->type == Xbinode &&
2948                             cast(binode, cs->condpart)->op == Block) {
2949                                 if (bracket)
2950                                         do_indent(indent, "while {\n");
2951                                 else
2952                                         do_indent(indent, "while:\n");
2953                                 print_exec(cs->condpart, indent+1, bracket);
2954                                 if (bracket)
2955                                         do_indent(indent, "} do {\n");
2956                                 else
2957                                         do_indent(indent, "do:\n");
2958                                 print_exec(cs->dopart, indent+1, bracket);
2959                                 if (bracket)
2960                                         do_indent(indent, "}\n");
2961                         } else {
2962                                 do_indent(indent, "while ");
2963                                 print_exec(cs->condpart, 0, bracket);
2964                                 if (bracket)
2965                                         printf(" {\n");
2966                                 else
2967                                         printf(":\n");
2968                                 print_exec(cs->dopart, indent+1, bracket);
2969                                 if (bracket)
2970                                         do_indent(indent, "}\n");
2971                         }
2972                 } else {
2973                         // a condition
2974                         if (cs->casepart)
2975                                 do_indent(indent, "switch");
2976                         else
2977                                 do_indent(indent, "if");
2978                         if (cs->condpart && cs->condpart->type == Xbinode &&
2979                             cast(binode, cs->condpart)->op == Block) {
2980                                 if (bracket)
2981                                         printf(" {\n");
2982                                 else
2983                                         printf(":\n");
2984                                 print_exec(cs->condpart, indent+1, bracket);
2985                                 if (bracket)
2986                                         do_indent(indent, "}\n");
2987                                 if (cs->thenpart) {
2988                                         do_indent(indent, "then:\n");
2989                                         print_exec(cs->thenpart, indent+1, bracket);
2990                                 }
2991                         } else {
2992                                 printf(" ");
2993                                 print_exec(cs->condpart, 0, bracket);
2994                                 if (cs->thenpart) {
2995                                         if (bracket)
2996                                                 printf(" {\n");
2997                                         else
2998                                                 printf(":\n");
2999                                         print_exec(cs->thenpart, indent+1, bracket);
3000                                         if (bracket)
3001                                                 do_indent(indent, "}\n");
3002                                 } else
3003                                         printf("\n");
3004                         }
3005                 }
3006                 for (cp = cs->casepart; cp; cp = cp->next) {
3007                         do_indent(indent, "case ");
3008                         print_exec(cp->value, -1, 0);
3009                         if (bracket)
3010                                 printf(" {\n");
3011                         else
3012                                 printf(":\n");
3013                         print_exec(cp->action, indent+1, bracket);
3014                         if (bracket)
3015                                 do_indent(indent, "}\n");
3016                 }
3017                 if (cs->elsepart) {
3018                         do_indent(indent, "else");
3019                         if (bracket)
3020                                 printf(" {\n");
3021                         else
3022                                 printf(":\n");
3023                         print_exec(cs->elsepart, indent+1, bracket);
3024                         if (bracket)
3025                                 do_indent(indent, "}\n");
3026                 }
3027                 break;
3028         }
3029
3030 ###### propagate exec cases
3031         case Xcond_statement:
3032         {
3033                 // forpart and dopart must return Tnone
3034                 // thenpart must return Tnone if there is a dopart,
3035                 // otherwise it is like elsepart.
3036                 // condpart must:
3037                 //    be bool if there is no casepart
3038                 //    match casepart->values if there is a switchpart
3039                 //    either be bool or match casepart->value if there
3040                 //             is a whilepart
3041                 // elsepart and casepart->action must match the return type
3042                 //   expected of this statement.
3043                 struct cond_statement *cs = cast(cond_statement, prog);
3044                 struct casepart *cp;
3045
3046                 t = propagate_types(cs->forpart, c, ok, Tnone, 0);
3047                 if (!type_compat(Tnone, t, 0))
3048                         *ok = 0;
3049                 t = propagate_types(cs->dopart, c, ok, Tnone, 0);
3050                 if (!type_compat(Tnone, t, 0))
3051                         *ok = 0;
3052                 if (cs->dopart) {
3053                         t = propagate_types(cs->thenpart, c, ok, Tnone, 0);
3054                         if (!type_compat(Tnone, t, 0))
3055                                 *ok = 0;
3056                 }
3057                 if (cs->casepart == NULL)
3058                         propagate_types(cs->condpart, c, ok, Tbool, 0);
3059                 else {
3060                         /* Condpart must match case values, with bool permitted */
3061                         t = NULL;
3062                         for (cp = cs->casepart;
3063                              cp && !t; cp = cp->next)
3064                                 t = propagate_types(cp->value, c, ok, NULL, 0);
3065                         if (!t && cs->condpart)
3066                                 t = propagate_types(cs->condpart, c, ok, NULL, Rboolok);
3067                         // Now we have a type (I hope) push it down
3068                         if (t) {
3069                                 for (cp = cs->casepart; cp; cp = cp->next)
3070                                         propagate_types(cp->value, c, ok, t, 0);
3071                                 propagate_types(cs->condpart, c, ok, t, Rboolok);
3072                         }
3073                 }
3074                 // (if)then, else, and case parts must return expected type.
3075                 if (!cs->dopart && !type)
3076                         type = propagate_types(cs->thenpart, c, ok, NULL, rules);
3077                 if (!type)
3078                         type = propagate_types(cs->elsepart, c, ok, NULL, rules);
3079                 for (cp = cs->casepart;
3080                      cp && !type;
3081                      cp = cp->next)
3082                         type = propagate_types(cp->action, c, ok, NULL, rules);
3083                 if (type) {
3084                         if (!cs->dopart)
3085                                 propagate_types(cs->thenpart, c, ok, type, rules);
3086                         propagate_types(cs->elsepart, c, ok, type, rules);
3087                         for (cp = cs->casepart; cp ; cp = cp->next)
3088                                 propagate_types(cp->action, c, ok, type, rules);
3089                         return type;
3090                 } else
3091                         return NULL;
3092         }
3093
3094 ###### interp exec cases
3095         case Xcond_statement:
3096         {
3097                 struct value v, cnd;
3098                 struct casepart *cp;
3099                 struct cond_statement *c = cast(cond_statement, e);
3100
3101                 if (c->forpart)
3102                         interp_exec(c->forpart);
3103                 do {
3104                         if (c->condpart)
3105                                 cnd = interp_exec(c->condpart);
3106                         else
3107                                 cnd.type = Tnone;
3108                         if (!(cnd.type == Tnone ||
3109                               (cnd.type == Tbool && cnd.bool != 0)))
3110                                 break;
3111                         // cnd is Tnone or Tbool, doesn't need to be freed
3112                         if (c->dopart)
3113                                 interp_exec(c->dopart);
3114
3115                         if (c->thenpart) {
3116                                 v = interp_exec(c->thenpart);
3117                                 if (v.type != Tnone || !c->dopart)
3118                                         return v;
3119                                 free_value(v);
3120                         }
3121                 } while (c->dopart);
3122
3123                 for (cp = c->casepart; cp; cp = cp->next) {
3124                         v = interp_exec(cp->value);
3125                         if (value_cmp(v, cnd) == 0) {
3126                                 free_value(v);
3127                                 free_value(cnd);
3128                                 return interp_exec(cp->action);
3129                         }
3130                         free_value(v);
3131                 }
3132                 free_value(cnd);
3133                 if (c->elsepart)
3134                         return interp_exec(c->elsepart);
3135                 v.type = Tnone;
3136                 return v;
3137         }
3138
3139 ### Finally the whole program.
3140
3141 Somewhat reminiscent of Pascal a (current) Ocean program starts with
3142 the keyword "program" and a list of variable names which are assigned
3143 values from command line arguments.  Following this is a `block` which
3144 is the code to execute.
3145
3146 As this is the top level, several things are handled a bit
3147 differently.
3148 The whole program is not interpreted by `interp_exec` as that isn't
3149 passed the argument list which the program requires.  Similarly type
3150 analysis is a bit more interesting at this level.
3151
3152 ###### Binode types
3153         Program,
3154
3155 ###### Parser: grammar
3156
3157         $*binode
3158         Program -> program OpenScope Varlist Block OptNL ${
3159                 $0 = new(binode);
3160                 $0->op = Program;
3161                 $0->left = reorder_bilist($<3);
3162                 $0->right = $<4;
3163                 var_block_close(config2context(config), CloseSequential);
3164                 if (config2context(config)->scope_stack) abort();
3165                 }$
3166                 | ERROR ${
3167                         tok_err(config2context(config),
3168                                 "error: unhandled parse error", &$1);
3169                 }$
3170
3171         Varlist -> Varlist ArgDecl ${
3172                         $0 = new(binode);
3173                         $0->op = Program;
3174                         $0->left = $<1;
3175                         $0->right = $<2;
3176                 }$
3177                 | ${ $0 = NULL; }$
3178
3179         $*var
3180         ArgDecl -> IDENTIFIER ${ {
3181                 struct variable *v = var_decl(config2context(config), $1.txt);
3182                 $0 = new(var);
3183                 $0->var = v;
3184         } }$
3185
3186         ## Grammar
3187
3188 ###### print binode cases
3189         case Program:
3190                 do_indent(indent, "program");
3191                 for (b2 = cast(binode, b->left); b2; b2 = cast(binode, b2->right)) {
3192                         printf(" ");
3193                         print_exec(b2->left, 0, 0);
3194                 }
3195                 if (bracket)
3196                         printf(" {\n");
3197                 else
3198                         printf(":\n");
3199                 print_exec(b->right, indent+1, bracket);
3200                 if (bracket)
3201                         do_indent(indent, "}\n");
3202                 break;
3203
3204 ###### propagate binode cases
3205         case Program: abort();
3206
3207 ###### core functions
3208
3209         static int analyse_prog(struct exec *prog, struct parse_context *c)
3210         {
3211                 struct binode *b = cast(binode, prog);
3212                 int ok = 1;
3213
3214                 if (!b)
3215                         return 0;
3216                 do {
3217                         ok = 1;
3218                         propagate_types(b->right, c, &ok, Tnone, 0);
3219                 } while (ok == 2);
3220                 if (!ok)
3221                         return 0;
3222
3223                 for (b = cast(binode, b->left); b; b = cast(binode, b->right)) {
3224                         struct var *v = cast(var, b->left);
3225                         if (!v->var->val.type) {
3226                                 v->var->where_set = b;
3227                                 v->var->val = val_prepare(Tstr);
3228                         }
3229                 }
3230                 b = cast(binode, prog);
3231                 do {
3232                         ok = 1;
3233                         propagate_types(b->right, c, &ok, Tnone, 0);
3234                 } while (ok == 2);
3235                 if (!ok)
3236                         return 0;
3237
3238                 /* Make sure everything is still consistent */
3239                 propagate_types(b->right, c, &ok, Tnone, 0);
3240                 return !!ok;
3241         }
3242
3243         static void interp_prog(struct exec *prog, char **argv)
3244         {
3245                 struct binode *p = cast(binode, prog);
3246                 struct binode *al;
3247                 struct value v;
3248
3249                 if (!prog)
3250                         return;
3251                 al = cast(binode, p->left);
3252                 while (al) {
3253                         struct var *v = cast(var, al->left);
3254                         struct value *vl = &v->var->val;
3255
3256                         if (argv[0] == NULL) {
3257                                 printf("Not enough args\n");
3258                                 exit(1);
3259                         }
3260                         al = cast(binode, al->right);
3261                         free_value(*vl);
3262                         *vl = parse_value(vl->type, argv[0]);
3263                         if (vl->type == NULL)
3264                                 exit(1);
3265                         argv++;
3266                 }
3267                 v = interp_exec(p->right);
3268                 free_value(v);
3269         }
3270
3271 ###### interp binode cases
3272         case Program: abort();
3273
3274 ## And now to test it out.
3275
3276 Having a language requires having a "hello world" program. I'll
3277 provide a little more than that: a program that prints "Hello world"
3278 finds the GCD of two numbers, prints the first few elements of
3279 Fibonacci, and performs a binary search for a number.
3280
3281 ###### File: oceani.mk
3282         tests :: sayhello
3283         sayhello : oceani
3284                 @echo "===== TEST ====="
3285                 ./oceani --section "test: hello" oceani.mdc 55 33
3286
3287 ###### test: hello
3288
3289         program A B:
3290                 print "Hello World, what lovely oceans you have!"
3291                 /* When a variable is defined in both branches of an 'if',
3292                  * and used afterwards, the variables are merged.
3293                  */
3294                 if A > B:
3295                         bigger := "yes"
3296                 else:
3297                         bigger := "no"
3298                 print "Is", A, "bigger than", B,"? ", bigger
3299                 /* If a variable is not used after the 'if', no
3300                  * merge happens, so types can be different
3301                  */
3302                 if A > B * 2:
3303                         double:string = "yes"
3304                         print A, "is more than twice", B, "?", double
3305                 else:
3306                         double := B*2
3307                         print "double", B, "is", double
3308
3309                 a : number
3310                 a = A;
3311                 b:number = B
3312                 if a > 0 and b > 0:
3313                         while a != b:
3314                                 if a < b:
3315                                         b = b - a
3316                                 else:
3317                                         a = a - b
3318                         print "GCD of", A, "and", B,"is", a
3319                 else if a <= 0:
3320                         print a, "is not positive, cannot calculate GCD"
3321                 else:
3322                         print b, "is not positive, cannot calculate GCD"
3323
3324                 for:
3325                         togo := 10
3326                         f1 := 1; f2 := 1
3327                         print "Fibonacci:", f1,f2,
3328                 then togo = togo - 1
3329                 while togo > 0:
3330                         f3 := f1 + f2
3331                         print "", f3,
3332                         f1 = f2
3333                         f2 = f3
3334                 print ""
3335
3336                 /* Binary search... */
3337                 for:
3338                         lo:= 0; hi := 100
3339                         target := 77
3340                 while:
3341                         mid := (lo + hi) / 2
3342                         if mid == target:
3343                                 use Found
3344                         if mid < target:
3345                                 lo = mid
3346                         else:
3347                                 hi = mid
3348                         if hi - lo < 1:
3349                                 use GiveUp
3350                         use True
3351                 do: pass
3352                 case Found:
3353                         print "Yay, I found", target
3354                 case GiveUp:
3355                         print "Closest I found was", mid