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