]> ocean-lang.org Git - ocean/blob - csrc/oceani.mdc
Oceani - Jamison Creek Version
[ocean] / csrc / oceani.mdc
1 # Ocean Interpreter - Jamison Creek version
2
3 Ocean is intended to be a compiled language, so this interpreter is
4 not targeted at being the final product.  It is, rather, an intermediate
5 stage and fills that role in two distinct ways.
6
7 Firstly, it exists as a platform to experiment with the early language
8 design.  An interpreter is easy to write and easy to get working, so
9 the barrier for entry is lower if I aim to start with an interpreter.
10
11 Secondly, the plan for the Ocean compiler is to write it in the
12 [Ocean language](http://ocean-lang.org).  To achieve this we naturally
13 need some sort of boot-strap process and this interpreter - written in
14 portable C - will fill that role.  It will be used to bootstrap the
15 Ocean compiler.
16
17 Two features that are not needed to fill either of these roles are
18 performance and completeness.  The interpreter only needs to be fast
19 enough to run small test programs and occasionally to run the compiler
20 on itself.  It only needs to be complete enough to test aspects of the
21 design which are developed before the compiler is working, and to run
22 the compiler on itself.  Any features not used by the compiler when
23 compiling itself are superfluous.  They may be included anyway, but
24 they may not.
25
26 Nonetheless, the interpreter should end up being reasonably complete,
27 and any performance bottlenecks which appear and are easily fixed, will
28 be.
29
30 ## Current version
31
32 This third version of the interpreter exists to test out some initial
33 ideas relating to types.  Particularly it adds arrays (indexed from
34 zero) and simple structures.  Basic control flow and variable scoping
35 are already fairly well established, as are basic numerical and
36 boolean operators.
37
38 Some operators that have only recently been added, and so have not
39 generated all that much experience yet are "and then" and "or else" as
40 short-circuit Boolean operators, and the "if ... else" trinary
41 operator which can select between two expressions based on a third
42 (which appears syntactically in the middle).
43
44 Elements that are present purely to make a usable language, and
45 without any expectation that they will remain, are the "program'
46 clause, which provides a list of variables to received command-line
47 arguments, and the "print" statement which performs simple output.
48
49 The current scalar types are "number", "Boolean", and "string".
50 Boolean will likely stay in its current form, the other two might, but
51 could just as easily be changed.
52
53 ## Naming
54
55 Versions of the interpreter which obviously do not support a complete
56 language will be named after creeks and streams.  This one is Jamison
57 Creek.
58
59 Once we have something reasonably resembling a complete language, the
60 names of rivers will be used.
61 Early versions of the compiler will be named after seas.  Major
62 releases of the compiler will be named after oceans.  Hopefully I will
63 be finished once I get to the Pacific Ocean release.
64
65 ## Outline
66
67 As well as parsing and executing a program, the interpreter can print
68 out the program from the parsed internal structure.  This is useful
69 for validating the parsing.
70 So the main requirements of the interpreter are:
71
72 - Parse the program, possibly with tracing,
73 - Analyse the parsed program to ensure consistency,
74 - Print the program,
75 - Execute the program, if no parsing or consistency errors were found.
76
77 This is all performed by a single C program extracted with
78 `parsergen`.
79
80 There will be two formats for printing the program: a default and one
81 that uses bracketing.  So a `--bracket` command line option is needed
82 for that.  Normally the first code section found is used, however an
83 alternate section can be requested so that a file (such as this one)
84 can contain multiple programs This is effected with the `--section`
85 option.
86
87 This code must be compiled with `-fplan9-extensions` so that anonymous
88 structures can be used.
89
90 ###### File: oceani.mk
91
92         myCFLAGS := -Wall -g -fplan9-extensions
93         CFLAGS := $(filter-out $(myCFLAGS),$(CFLAGS)) $(myCFLAGS)
94         myLDLIBS:= libparser.o libscanner.o libmdcode.o -licuuc
95         LDLIBS := $(filter-out $(myLDLIBS),$(LDLIBS)) $(myLDLIBS)
96         ## libs
97         all :: $(LDLIBS) oceani
98         oceani.c oceani.h : oceani.mdc parsergen
99                 ./parsergen -o oceani --LALR --tag Parser oceani.mdc
100         oceani.mk: oceani.mdc md2c
101                 ./md2c oceani.mdc
102
103         oceani: oceani.o $(LDLIBS)
104                 $(CC) $(CFLAGS) -o oceani oceani.o $(LDLIBS)
105
106 ###### Parser: header
107         ## macros
108         ## ast
109         struct parse_context {
110                 struct token_config config;
111                 char *file_name;
112                 int parse_error;
113                 struct exec *prog;
114                 ## parse context
115         };
116
117 ###### macros
118
119         #define container_of(ptr, type, member) ({                      \
120                 const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
121                 (type *)( (char *)__mptr - offsetof(type,member) );})
122
123         #define config2context(_conf) container_of(_conf, struct parse_context, \
124                 config)
125
126 ###### Parser: code
127
128         #include <unistd.h>
129         #include <stdlib.h>
130         #include <fcntl.h>
131         #include <errno.h>
132         #include <sys/mman.h>
133         #include <string.h>
134         #include <stdio.h>
135         #include <locale.h>
136         #include <malloc.h>
137         #include "mdcode.h"
138         #include "scanner.h"
139         #include "parser.h"
140
141         ## includes
142
143         #include "oceani.h"
144
145         ## forward decls
146         ## value functions
147         ## ast functions
148         ## core functions
149
150         #include <getopt.h>
151         static char Usage[] = "Usage: oceani --trace --print --noexec --brackets"
152                               "--section=SectionName prog.ocn\n";
153         static const struct option long_options[] = {
154                 {"trace",     0, NULL, 't'},
155                 {"print",     0, NULL, 'p'},
156                 {"noexec",    0, NULL, 'n'},
157                 {"brackets",  0, NULL, 'b'},
158                 {"section",   1, NULL, 's'},
159                 {NULL,        0, NULL, 0},
160         };
161         const char *options = "tpnbs";
162         int main(int argc, char *argv[])
163         {
164                 int fd;
165                 int len;
166                 char *file;
167                 struct section *s, *ss;
168                 char *section = NULL;
169                 struct parse_context context = {
170                         .config = {
171                                 .ignored = (1 << TK_line_comment)
172                                          | (1 << TK_block_comment),
173                                 .number_chars = ".,_+-",
174                                 .word_start = "_",
175                                 .word_cont = "_",
176                         },
177                 };
178                 int doprint=0, dotrace=0, doexec=1, brackets=0;
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
211                 ## context initialization
212
213                 if (section) {
214                         for (ss = s; ss; ss = ss->next) {
215                                 struct text sec = ss->section;
216                                 if (sec.len == strlen(section) &&
217                                     strncmp(sec.txt, section, sec.len) == 0)
218                                         break;
219                         }
220                         if (!ss) {
221                                 fprintf(stderr, "oceani: cannot find section %s\n",
222                                         section);
223                                 exit(1);
224                         }
225                 } else
226                         ss = s;
227                 parse_oceani(ss->code, &context.config, dotrace ? stderr : NULL);
228
229                 if (!context.prog) {
230                         fprintf(stderr, "oceani: no program found.\n");
231                         context.parse_error = 1;
232                 }
233                 if (context.prog && doprint) {
234                         ## print const decls
235                         ## print type decls
236                         print_exec(context.prog, 0, brackets);
237                 }
238                 if (context.prog && doexec && !context.parse_error) {
239                         if (!analyse_prog(context.prog, &context)) {
240                                 fprintf(stderr, "oceani: type error in program - not running.\n");
241                                 exit(1);
242                         }
243                         interp_prog(context.prog, argv+optind+1);
244                 }
245                 free_exec(context.prog);
246
247                 while (s) {
248                         struct section *t = s->next;
249                         code_free(s->code);
250                         free(s);
251                         s = t;
252                 }
253                 ## free context vars
254                 ## free context types
255                 exit(context.parse_error ? 1 : 0);
256         }
257
258 ### Analysis
259
260 The four requirements of parse, analyse, print, interpret apply to
261 each language element individually so that is how most of the code
262 will be structured.
263
264 Three of the four are fairly self explanatory.  The one that requires
265 a little explanation is the analysis step.
266
267 The current language design does not require the types of variables to
268 be declared, but they must still have a single type.  Different
269 operations impose different requirements on the variables, for example
270 addition requires both arguments to be numeric, and assignment
271 requires the variable on the left to have the same type as the
272 expression on the right.
273
274 Analysis involves propagating these type requirements around and
275 consequently setting the type of each variable.  If any requirements
276 are violated (e.g. a string is compared with a number) or if a
277 variable needs to have two different types, then an error is raised
278 and the program will not run.
279
280 If the same variable is declared in both branchs of an 'if/else', or
281 in all cases of a 'switch' then the multiple instances may be merged
282 into just one variable if the variable is references after the
283 conditional statement.  When this happens, the types must naturally be
284 consistent across all the branches.  When the variable is not used
285 outside the if, the variables in the different branches are distinct
286 and can be of different types.
287
288 Determining the types of all variables early is important for
289 processing command line arguments.  These can be assigned to any of
290 several types of variable, but we must first know the correct type so
291 any required conversion can happen.  If a variable is associated with
292 a command line argument but no type can be interpreted (e.g. the
293 variable is only ever used in a `print` statement), then the type is
294 set to 'string'.
295
296 Undeclared names may only appear in "use" statements and "case" expressions.
297 These names are given a type of "label" and a unique value.
298 This allows them to fill the role of a name in an enumerated type, which
299 is useful for testing the `switch` statement.
300
301 As we will see, the condition part of a `while` statement can return
302 either a Boolean or some other type.  This requires that the expected
303 type that gets passed around comprises a type and a flag to indicate
304 that `Tbool` is also permitted.
305
306 As there are, as yet, no distinct types that are compatible, there
307 isn't much subtlety in the analysis.  When we have distinct number
308 types, this will become more interesting.
309
310 #### Error reporting
311
312 When analysis discovers an inconsistency it needs to report an error;
313 just refusing to run the code ensures that the error doesn't cascade,
314 but by itself it isn't very useful.  A clear understanding of the sort
315 of error message that are useful will help guide the process of
316 analysis.
317
318 At a simplistic level, the only sort of error that type analysis can
319 report is that the type of some construct doesn't match a contextual
320 requirement.  For example, in `4 + "hello"` the addition provides a
321 contextual requirement for numbers, but `"hello"` is not a number.  In
322 this particular example no further information is needed as the types
323 are obvious from local information.  When a variable is involved that
324 isn't the case.  It may be helpful to explain why the variable has a
325 particular type, by indicating the location where the type was set,
326 whether by declaration or usage.
327
328 Using a recursive-descent analysis we can easily detect a problem at
329 multiple locations. In "`hello:= "there"; 4 + hello`" the addition
330 will detect that one argument is not a number and the usage of `hello`
331 will detect that a number was wanted, but not provided.  In this
332 (early) version of the language, we will generate error reports at
333 multiple locations, so the use of `hello` will report an error and
334 explain were the value was set, and the addition will report an error
335 and say why numbers are needed.  To be able to report locations for
336 errors, each language element will need to record a file location
337 (line and column) and each variable will need to record the language
338 element where its type was set.  For now we will assume that each line
339 of an error message indicates one location in the file, and up to 2
340 types.  So we provide a `printf`-like function which takes a format, a
341 language (a `struct exec` which has not yet been introduced), and 2
342 types. "`%1`" reports the first type, "`%2`" reports the second.  We
343 will need a function to print the location, once we know how that is
344 stored.  As will be explained later, there are sometimes extra rules for
345 type matching and they might affect error messages, we need to pass those
346 in too.
347
348 As well as type errors, we sometimes need to report problems with
349 tokens, which might be unexpected or might name a type that has not
350 been defined.  For these we have `tok_err()` which reports an error
351 with a given token.  Each of the error functions sets the flag in the
352 context so indicate that parsing failed.
353
354 ###### forward decls
355
356         static void fput_loc(struct exec *loc, FILE *f);
357
358 ###### core functions
359
360         static void type_err(struct parse_context *c,
361                              char *fmt, struct exec *loc,
362                              struct type *t1, int rules, struct type *t2)
363         {
364                 fprintf(stderr, "%s:", c->file_name);
365                 fput_loc(loc, stderr);
366                 for (; *fmt ; fmt++) {
367                         if (*fmt != '%') {
368                                 fputc(*fmt, stderr);
369                                 continue;
370                         }
371                         fmt++;
372                         switch (*fmt) {
373                         case '%': fputc(*fmt, stderr); break;   // NOTEST
374                         default: fputc('?', stderr); break;     // NOTEST
375                         case '1':
376                                 type_print(t1, stderr);
377                                 break;
378                         case '2':
379                                 type_print(t2, stderr);
380                                 break;
381                         ## format cases
382                         }
383                 }
384                 fputs("\n", stderr);
385                 c->parse_error = 1;
386         }
387
388         static void tok_err(struct parse_context *c, char *fmt, struct token *t)
389         {
390                 fprintf(stderr, "%s:%d:%d: %s: %.*s\n", c->file_name, t->line, t->col, fmt,
391                         t->txt.len, t->txt.txt);
392                 c->parse_error = 1;
393         }
394
395 ## Entities: declared and predeclared.
396
397 There are various "things" that the language and/or the interpreter
398 needs to know about to parse and execute a program.  These include
399 types, variables, values, and executable code.  These are all lumped
400 together under the term "entities" (calling them "objects" would be
401 confusing) and introduced here.  These will introduced and described
402 here.  The following section will present the different specific code
403 elements which comprise or manipulate these various entities.
404
405 ### Types
406
407 Values come in a wide range of types, with more likely to be added.
408 Each type needs to be able to parse and print its own values (for
409 convenience at least) as well as to compare two values, at least for
410 equality and possibly for order.  For now, values might need to be
411 duplicated and freed, though eventually such manipulations will be
412 better integrated into the language.
413
414 Rather than requiring every numeric type to support all numeric
415 operations (add, multiple, etc), we allow types to be able to present
416 as one of a few standard types: integer, float, and fraction.  The
417 existence of these conversion functions eventaully enable types to
418 determine if they are compatible with other types, though such types
419 have not yet been implemented.
420
421 Named type are stored in a simple linked list.  Objects of each type are "values"
422 which are often passed around by value.
423
424 ###### ast
425
426         struct value {
427                 struct type *type;
428                 union {
429                         ## value union fields
430                 };
431         };
432
433         struct type {
434                 struct text name;
435                 struct type *next;
436                 struct value (*init)(struct type *type);
437                 struct value (*prepare)(struct type *type);
438                 struct value (*parse)(struct type *type, char *str);
439                 void (*print)(struct value val);
440                 void (*print_type)(struct type *type, FILE *f);
441                 int (*cmp_order)(struct value v1, struct value v2);
442                 int (*cmp_eq)(struct value v1, struct value v2);
443                 struct value (*dup)(struct value val);
444                 void (*free)(struct value val);
445                 void (*free_type)(struct type *t);
446                 int (*compat)(struct type *this, struct type *other);
447                 long long (*to_int)(struct value *v);
448                 double (*to_float)(struct value *v);
449                 int (*to_mpq)(mpq_t *q, struct value *v);
450                 ## type functions
451                 union {
452                         ## type union fields
453                 };
454         };
455
456 ###### parse context
457
458         struct type *typelist;
459
460 ###### ast functions
461
462         static struct type *find_type(struct parse_context *c, struct text s)
463         {
464                 struct type *l = c->typelist;
465
466                 while (l &&
467                        text_cmp(l->name, s) != 0)
468                                 l = l->next;
469                 return l;
470         }
471
472         static struct type *add_type(struct parse_context *c, struct text s,
473                                      struct type *proto)
474         {
475                 struct type *n;
476
477                 n = calloc(1, sizeof(*n));
478                 *n = *proto;
479                 n->name = s;
480                 n->next = c->typelist;
481                 c->typelist = n;
482                 return n;
483         }
484
485         static void free_type(struct type *t)
486         {
487                 /* The type is always a reference to something in the
488                  * context, so we don't need to free anything.
489                  */
490         }
491
492         static void free_value(struct value v)
493         {
494                 if (v.type)
495                         v.type->free(v);
496         }
497
498         static int type_compat(struct type *require, struct type *have, int rules)
499         {
500                 if ((rules & Rboolok) && have == Tbool)
501                         return 1;
502                 if ((rules & Rnolabel) && have == Tlabel)
503                         return 0;
504                 if (!require || !have)
505                         return 1;
506
507                 if (require->compat)
508                         return require->compat(require, have);
509
510                 return require == have;
511         }
512
513         static void type_print(struct type *type, FILE *f)
514         {
515                 if (!type)
516                         fputs("*unknown*type*", f);
517                 else if (type->name.len)
518                         fprintf(f, "%.*s", type->name.len, type->name.txt);
519                 else if (type->print_type)
520                         type->print_type(type, f);
521                 else
522                         fputs("*invalid*type*", f);     // NOTEST
523         }
524
525         static struct value val_prepare(struct type *type)
526         {
527                 struct value rv;
528
529                 if (type)
530                         return type->prepare(type);
531                 rv.type = type;
532                 return rv;
533         }
534
535         static struct value val_init(struct type *type)
536         {
537                 struct value rv;
538
539                 if (type)
540                         return type->init(type);
541                 rv.type = type;
542                 return rv;
543         }
544
545         static struct value dup_value(struct value v)
546         {
547                 if (v.type)
548                         return v.type->dup(v);
549                 return v;
550         }
551
552         static int value_cmp(struct value left, struct value right)
553         {
554                 if (left.type && left.type->cmp_order)
555                         return left.type->cmp_order(left, right);
556                 if (left.type && left.type->cmp_eq)
557                         return left.type->cmp_eq(left, right);
558                 return -1;
559         }
560
561         static void print_value(struct value v)
562         {
563                 if (v.type && v.type->print)
564                         v.type->print(v);
565                 else
566                         printf("*Unknown*");            // NOTEST
567         }
568
569         static struct value parse_value(struct type *type, char *arg)
570         {
571                 struct value rv;
572
573                 if (type && type->parse)
574                         return type->parse(type, arg);
575                 rv.type = NULL;                         // NOTEST
576                 return rv;                              // NOTEST
577         }
578
579 ###### forward decls
580
581         static void free_value(struct value v);
582         static int type_compat(struct type *require, struct type *have, int rules);
583         static void type_print(struct type *type, FILE *f);
584         static struct value val_init(struct type *type);
585         static struct value dup_value(struct value v);
586         static int value_cmp(struct value left, struct value right);
587         static void print_value(struct value v);
588         static struct value parse_value(struct type *type, char *arg);
589
590 ###### free context types
591
592         while (context.typelist) {
593                 struct type *t = context.typelist;
594
595                 context.typelist = t->next;
596                 if (t->free_type)
597                         t->free_type(t);
598                 free(t);
599         }
600
601 #### Base Types
602
603 Values of the base types can be numbers, which we represent as
604 multi-precision fractions, strings, Booleans and labels.  When
605 analysing the program we also need to allow for places where no value
606 is meaningful (type `Tnone`) and where we don't know what type to
607 expect yet (type is `NULL`).
608
609 Values are never shared, they are always copied when used, and freed
610 when no longer needed.
611
612 When propagating type information around the program, we need to
613 determine if two types are compatible, where type `NULL` is compatible
614 with anything.  There are two special cases with type compatibility,
615 both related to the Conditional Statement which will be described
616 later.  In some cases a Boolean can be accepted as well as some other
617 primary type, and in others any type is acceptable except a label (`Vlabel`).
618 A separate function encoding these cases will simplify some code later.
619
620 When assigning command line arguments to variables, we need to be able
621 to parse each type from a string.
622
623 The distinction beteen "prepare" and "init" needs to be explained.
624 "init" sets up an initial value, such as "zero" or the empty string.
625 "prepare" simply prepares the data structure so that if "free" gets
626 called on it, it won't do something silly.  Normally a value will be
627 stored after "prepare" but before "free", but this might not happen if
628 there are errors.
629
630 ###### includes
631         #include <gmp.h>
632         #include "string.h"
633         #include "number.h"
634
635 ###### libs
636         myLDLIBS := libnumber.o libstring.o -lgmp
637         LDLIBS := $(filter-out $(myLDLIBS),$(LDLIBS)) $(myLDLIBS)
638
639 ###### type union fields
640         enum vtype {Vnone, Vstr, Vnum, Vbool, Vlabel} vtype;
641
642 ###### value union fields
643         struct text str;
644         mpq_t num;
645         int bool;
646         void *label;
647
648 ###### ast functions
649         static void _free_value(struct value v)
650         {
651                 switch (v.type->vtype) {
652                 case Vnone: break;
653                 case Vstr: free(v.str.txt); break;
654                 case Vnum: mpq_clear(v.num); break;
655                 case Vlabel:
656                 case Vbool: break;
657                 }
658         }
659
660 ###### value functions
661
662         static struct value _val_prepare(struct type *type)
663         {
664                 struct value rv;
665
666                 rv.type = type;
667                 switch(type->vtype) {
668                 case Vnone:
669                         break;
670                 case Vnum:
671                         memset(&rv.num, 0, sizeof(rv.num));
672                         break;
673                 case Vstr:
674                         rv.str.txt = NULL;
675                         rv.str.len = 0;
676                         break;
677                 case Vbool:
678                         rv.bool = 0;
679                         break;
680                 case Vlabel:
681                         rv.label = NULL;
682                         break;
683                 }
684                 return rv;
685         }
686
687         static struct value _val_init(struct type *type)
688         {
689                 struct value rv;
690
691                 rv.type = type;
692                 switch(type->vtype) {
693                 case Vnone:             // NOTEST
694                         break;          // NOTEST
695                 case Vnum:
696                         mpq_init(rv.num); break;
697                 case Vstr:
698                         rv.str.txt = malloc(1);
699                         rv.str.len = 0;
700                         break;
701                 case Vbool:
702                         rv.bool = 0;
703                         break;
704                 case Vlabel:                    // NOTEST
705                         rv.label = NULL;        // NOTEST
706                         break;                  // NOTEST
707                 }
708                 return rv;
709         }
710
711         static struct value _dup_value(struct value v)
712         {
713                 struct value rv;
714                 rv.type = v.type;
715                 switch (rv.type->vtype) {
716                 case Vnone:             // NOTEST
717                         break;          // NOTEST
718                 case Vlabel:
719                         rv.label = v.label;
720                         break;
721                 case Vbool:
722                         rv.bool = v.bool;
723                         break;
724                 case Vnum:
725                         mpq_init(rv.num);
726                         mpq_set(rv.num, v.num);
727                         break;
728                 case Vstr:
729                         rv.str.len = v.str.len;
730                         rv.str.txt = malloc(rv.str.len);
731                         memcpy(rv.str.txt, v.str.txt, v.str.len);
732                         break;
733                 }
734                 return rv;
735         }
736
737         static int _value_cmp(struct value left, struct value right)
738         {
739                 int cmp;
740                 if (left.type != right.type)
741                         return left.type - right.type;  // NOTEST
742                 switch (left.type->vtype) {
743                 case Vlabel: cmp = left.label == right.label ? 0 : 1; break;
744                 case Vnum: cmp = mpq_cmp(left.num, right.num); break;
745                 case Vstr: cmp = text_cmp(left.str, right.str); break;
746                 case Vbool: cmp = left.bool - right.bool; break;
747                 case Vnone: cmp = 0;                    // NOTEST
748                 }
749                 return cmp;
750         }
751
752         static void _print_value(struct value v)
753         {
754                 switch (v.type->vtype) {
755                 case Vnone:                             // NOTEST
756                         printf("*no-value*"); break;    // NOTEST
757                 case Vlabel:                            // NOTEST
758                         printf("*label-%p*", v.label); break; // NOTEST
759                 case Vstr:
760                         printf("%.*s", v.str.len, v.str.txt); break;
761                 case Vbool:
762                         printf("%s", v.bool ? "True":"False"); break;
763                 case Vnum:
764                         {
765                         mpf_t fl;
766                         mpf_init2(fl, 20);
767                         mpf_set_q(fl, v.num);
768                         gmp_printf("%Fg", fl);
769                         mpf_clear(fl);
770                         break;
771                         }
772                 }
773         }
774
775         static struct value _parse_value(struct type *type, char *arg)
776         {
777                 struct value val;
778                 struct text tx;
779                 int neg = 0;
780                 char tail[3] = "";
781
782                 val.type = type;
783                 switch(type->vtype) {
784                 case Vlabel:                            // NOTEST
785                 case Vnone:                             // NOTEST
786                         val.type = NULL;                // NOTEST
787                         break;                          // NOTEST
788                 case Vstr:
789                         val.str.len = strlen(arg);
790                         val.str.txt = malloc(val.str.len);
791                         memcpy(val.str.txt, arg, val.str.len);
792                         break;
793                 case Vnum:
794                         if (*arg == '-') {
795                                 neg = 1;
796                                 arg++;
797                         }
798                         tx.txt = arg; tx.len = strlen(tx.txt);
799                         if (number_parse(val.num, tail, tx) == 0)
800                                 mpq_init(val.num);
801                         else if (neg)
802                                 mpq_neg(val.num, val.num);
803                         if (tail[0]) {
804                                 printf("Unsupported suffix: %s\n", arg);
805                                 val.type = NULL;
806                         }
807                         break;
808                 case Vbool:
809                         if (strcasecmp(arg, "true") == 0 ||
810                             strcmp(arg, "1") == 0)
811                                 val.bool = 1;
812                         else if (strcasecmp(arg, "false") == 0 ||
813                                  strcmp(arg, "0") == 0)
814                                 val.bool = 0;
815                         else {
816                                 printf("Bad bool: %s\n", arg);
817                                 val.type = NULL;
818                         }
819                         break;
820                 }
821                 return val;
822         }
823
824         static void _free_value(struct value v);
825
826         static struct type base_prototype = {
827                 .init = _val_init,
828                 .prepare = _val_prepare,
829                 .parse = _parse_value,
830                 .print = _print_value,
831                 .cmp_order = _value_cmp,
832                 .cmp_eq = _value_cmp,
833                 .dup = _dup_value,
834                 .free = _free_value,
835         };
836
837         static struct type *Tbool, *Tstr, *Tnum, *Tnone, *Tlabel;
838
839 ###### ast functions
840         static struct type *add_base_type(struct parse_context *c, char *n, enum vtype vt)
841         {
842                 struct text txt = { n, strlen(n) };
843                 struct type *t;
844
845                 t = add_type(c, txt, &base_prototype);
846                 t->vtype = vt;
847                 return t;
848         }
849
850 ###### context initialization
851
852         Tbool  = add_base_type(&context, "Boolean", Vbool);
853         Tstr   = add_base_type(&context, "string", Vstr);
854         Tnum   = add_base_type(&context, "number", Vnum);
855         Tnone  = add_base_type(&context, "none", Vnone);
856         Tlabel = add_base_type(&context, "label", Vlabel);
857
858 ### Variables
859
860 Variables are scoped named values.  We store the names in a linked
861 list of "bindings" sorted lexically, and use sequential search and
862 insertion sort.
863
864 ###### ast
865
866         struct binding {
867                 struct text name;
868                 struct binding *next;   // in lexical order
869                 ## binding fields
870         };
871
872 This linked list is stored in the parse context so that "reduce"
873 functions can find or add variables, and so the analysis phase can
874 ensure that every variable gets a type.
875
876 ###### parse context
877
878         struct binding *varlist;  // In lexical order
879
880 ###### ast functions
881
882         static struct binding *find_binding(struct parse_context *c, struct text s)
883         {
884                 struct binding **l = &c->varlist;
885                 struct binding *n;
886                 int cmp = 1;
887
888                 while (*l &&
889                         (cmp = text_cmp((*l)->name, s)) < 0)
890                                 l = & (*l)->next;
891                 if (cmp == 0)
892                         return *l;
893                 n = calloc(1, sizeof(*n));
894                 n->name = s;
895                 n->next = *l;
896                 *l = n;
897                 return n;
898         }
899
900 Each name can be linked to multiple variables defined in different
901 scopes.  Each scope starts where the name is declared and continues
902 until the end of the containing code block.  Scopes of a given name
903 cannot nest, so a declaration while a name is in-scope is an error.
904
905 ###### binding fields
906         struct variable *var;
907
908 ###### ast
909         struct variable {
910                 struct variable *previous;
911                 struct value val;
912                 struct binding *name;
913                 struct exec *where_decl;// where name was declared
914                 struct exec *where_set; // where type was set
915                 ## variable fields
916         };
917
918 While the naming seems strange, we include local constants in the
919 definition of variables.  A name declared `var := value` can
920 subsequently be changed, but a name declared `var ::= value` cannot -
921 it is constant
922
923 ###### variable fields
924         int constant;
925
926 Scopes in parallel branches can be partially merged.  More
927 specifically, if a given name is declared in both branches of an
928 if/else then its scope is a candidate for merging.  Similarly if
929 every branch of an exhaustive switch (e.g. has an "else" clause)
930 declares a given name, then the scopes from the branches are
931 candidates for merging.
932
933 Note that names declared inside a loop (which is only parallel to
934 itself) are never visible after the loop.  Similarly names defined in
935 scopes which are not parallel, such as those started by `for` and
936 `switch`, are never visible after the scope.  Only variables defined in
937 both `then` and `else` (including the implicit then after an `if`, and
938 excluding `then` used with `for`) and in all `case`s and `else` of a
939 `switch` or `while` can be visible beyond the `if`/`switch`/`while`.
940
941 Labels, which are a bit like variables, follow different rules.
942 Labels are not explicitly declared, but if an undeclared name appears
943 in a context where a label is legal, that effectively declares the
944 name as a label.  The declaration remains in force (or in scope) at
945 least to the end of the immediately containing block and conditionally
946 in any larger containing block which does not declare the name in some
947 other way.  Importantly, the conditional scope extension happens even
948 if the label is only used in one parallel branch of a conditional --
949 when used in one branch it is treated as having been declared in all
950 branches.
951
952 Merge candidates are tentatively visible beyond the end of the
953 branching statement which creates them.  If the name is used, the
954 merge is affirmed and they become a single variable visible at the
955 outer layer.  If not - if it is redeclared first - the merge lapses.
956
957 To track scopes we have an extra stack, implemented as a linked list,
958 which roughly parallels the parse stack and which is used exclusively
959 for scoping.  When a new scope is opened, a new frame is pushed and
960 the child-count of the parent frame is incremented.  This child-count
961 is used to distinguish between the first of a set of parallel scopes,
962 in which declared variables must not be in scope, and subsequent
963 branches, whether they must already be conditionally scoped.
964
965 To push a new frame *before* any code in the frame is parsed, we need a
966 grammar reduction.  This is most easily achieved with a grammar
967 element which derives the empty string, and creates the new scope when
968 it is recognized.  This can be placed, for example, between a keyword
969 like "if" and the code following it.
970
971 ###### ast
972         struct scope {
973                 struct scope *parent;
974                 int child_count;
975         };
976
977 ###### parse context
978         int scope_depth;
979         struct scope *scope_stack;
980
981 ###### ast functions
982         static void scope_pop(struct parse_context *c)
983         {
984                 struct scope *s = c->scope_stack;
985
986                 c->scope_stack = s->parent;
987                 free(s);
988                 c->scope_depth -= 1;
989         }
990
991         static void scope_push(struct parse_context *c)
992         {
993                 struct scope *s = calloc(1, sizeof(*s));
994                 if (c->scope_stack)
995                         c->scope_stack->child_count += 1;
996                 s->parent = c->scope_stack;
997                 c->scope_stack = s;
998                 c->scope_depth += 1;
999         }
1000
1001 ###### Grammar
1002
1003         $void
1004         OpenScope -> ${ scope_push(config2context(config)); }$
1005
1006 Each variable records a scope depth and is in one of four states:
1007
1008 - "in scope".  This is the case between the declaration of the
1009   variable and the end of the containing block, and also between
1010   the usage with affirms a merge and the end of that block.
1011
1012   The scope depth is not greater than the current parse context scope
1013   nest depth.  When the block of that depth closes, the state will
1014   change.  To achieve this, all "in scope" variables are linked
1015   together as a stack in nesting order.
1016
1017 - "pending".  The "in scope" block has closed, but other parallel
1018   scopes are still being processed.  So far, every parallel block at
1019   the same level that has closed has declared the name.
1020
1021   The scope depth is the depth of the last parallel block that
1022   enclosed the declaration, and that has closed.
1023
1024 - "conditionally in scope".  The "in scope" block and all parallel
1025   scopes have closed, and no further mention of the name has been
1026   seen.  This state includes a secondary nest depth which records the
1027   outermost scope seen since the variable became conditionally in
1028   scope.  If a use of the name is found, the variable becomes "in
1029   scope" and that secondary depth becomes the recorded scope depth.
1030   If the name is declared as a new variable, the old variable becomes
1031   "out of scope" and the recorded scope depth stays unchanged.
1032
1033 - "out of scope".  The variable is neither in scope nor conditionally
1034   in scope.  It is permanently out of scope now and can be removed from
1035   the "in scope" stack.
1036
1037
1038 ###### variable fields
1039         int depth, min_depth;
1040         enum { OutScope, PendingScope, CondScope, InScope } scope;
1041         struct variable *in_scope;
1042
1043 ###### parse context
1044
1045         struct variable *in_scope;
1046
1047 All variables with the same name are linked together using the
1048 'previous' link.  Those variable that have
1049 been affirmatively merged all have a 'merged' pointer that points to
1050 one primary variable - the most recently declared instance. When
1051 merging variables, we need to also adjust the 'merged' pointer on any
1052 other variables that had previously been merged with the one that will
1053 no longer be primary.
1054
1055 A variable that is no longer the most recent instance of a name may
1056 still have "pending" scope, if it might still be merged with most
1057 recent instance.  These variables don't really belong in the
1058 "in_scope" list, but are not immediately removed when a new instance
1059 is found.  Instead, they are detected and ignored when considering the
1060 list of in_scope names.
1061
1062 ###### variable fields
1063         struct variable *merged;
1064
1065 ###### ast functions
1066
1067         static void variable_merge(struct variable *primary, struct variable *secondary)
1068         {
1069                 struct variable *v;
1070
1071                 if (primary->merged)
1072                         // shouldn't happen
1073                         primary = primary->merged;
1074
1075                 for (v = primary->previous; v; v=v->previous)
1076                         if (v == secondary || v == secondary->merged ||
1077                             v->merged == secondary ||
1078                             (v->merged && v->merged == secondary->merged)) {
1079                                 v->scope = OutScope;
1080                                 v->merged = primary;
1081                         }
1082         }
1083
1084 ###### free context vars
1085
1086         while (context.varlist) {
1087                 struct binding *b = context.varlist;
1088                 struct variable *v = b->var;
1089                 context.varlist = b->next;
1090                 free(b);
1091                 while (v) {
1092                         struct variable *t = v;
1093
1094                         v = t->previous;
1095                         free_value(t->val);
1096                         if (t->min_depth == 0)
1097                                 // This is a global constant
1098                                 free_exec(t->where_decl);
1099                         free(t);
1100                 }
1101         }
1102
1103 #### Manipulating Bindings
1104
1105 When a name is conditionally visible, a new declaration discards the
1106 old binding - the condition lapses.  Conversely a usage of the name
1107 affirms the visibility and extends it to the end of the containing
1108 block - i.e. the block that contains both the original declaration and
1109 the latest usage.  This is determined from `min_depth`.  When a
1110 conditionally visible variable gets affirmed like this, it is also
1111 merged with other conditionally visible variables with the same name.
1112
1113 When we parse a variable declaration we either report an error if the
1114 name is currently bound, or create a new variable at the current nest
1115 depth if the name is unbound or bound to a conditionally scoped or
1116 pending-scope variable.  If the previous variable was conditionally
1117 scoped, it and its homonyms becomes out-of-scope.
1118
1119 When we parse a variable reference (including non-declarative
1120 assignment) we report an error if the name is not bound or is bound to
1121 a pending-scope variable; update the scope if the name is bound to a
1122 conditionally scoped variable; or just proceed normally if the named
1123 variable is in scope.
1124
1125 When we exit a scope, any variables bound at this level are either
1126 marked out of scope or pending-scoped, depending on whether the scope
1127 was sequential or parallel.  Here a "parallel" scope means the "then"
1128 or "else" part of a conditional, or any "case" or "else" branch of a
1129 switch.  Other scopes are "sequential".
1130
1131 When exiting a parallel scope we check if there are any variables that
1132 were previously pending and are still visible. If there are, then
1133 there weren't redeclared in the most recent scope, so they cannot be
1134 merged and must become out-of-scope.  If it is not the first of
1135 parallel scopes (based on `child_count`), we check that there was a
1136 previous binding that is still pending-scope.  If there isn't, the new
1137 variable must now be out-of-scope.
1138
1139 When exiting a sequential scope that immediately enclosed parallel
1140 scopes, we need to resolve any pending-scope variables.  If there was
1141 no `else` clause, and we cannot determine that the `switch` was exhaustive,
1142 we need to mark all pending-scope variable as out-of-scope.  Otherwise
1143 all pending-scope variables become conditionally scoped.
1144
1145 ###### ast
1146         enum closetype { CloseSequential, CloseParallel, CloseElse };
1147
1148 ###### ast functions
1149
1150         static struct variable *var_decl(struct parse_context *c, struct text s)
1151         {
1152                 struct binding *b = find_binding(c, s);
1153                 struct variable *v = b->var;
1154
1155                 switch (v ? v->scope : OutScope) {
1156                 case InScope:
1157                         /* Caller will report the error */
1158                         return NULL;
1159                 case CondScope:
1160                         for (;
1161                              v && v->scope == CondScope;
1162                              v = v->previous)
1163                                 v->scope = OutScope;
1164                         break;
1165                 default: break;
1166                 }
1167                 v = calloc(1, sizeof(*v));
1168                 v->previous = b->var;
1169                 b->var = v;
1170                 v->name = b;
1171                 v->min_depth = v->depth = c->scope_depth;
1172                 v->scope = InScope;
1173                 v->in_scope = c->in_scope;
1174                 c->in_scope = v;
1175                 v->val = val_prepare(NULL);
1176                 return v;
1177         }
1178
1179         static struct variable *var_ref(struct parse_context *c, struct text s)
1180         {
1181                 struct binding *b = find_binding(c, s);
1182                 struct variable *v = b->var;
1183                 struct variable *v2;
1184
1185                 switch (v ? v->scope : OutScope) {
1186                 case OutScope:
1187                 case PendingScope:
1188                         /* Caller will report the error */
1189                         return NULL;
1190                 case CondScope:
1191                         /* All CondScope variables of this name need to be merged
1192                          * and become InScope
1193                          */
1194                         v->depth = v->min_depth;
1195                         v->scope = InScope;
1196                         for (v2 = v->previous;
1197                              v2 && v2->scope == CondScope;
1198                              v2 = v2->previous)
1199                                 variable_merge(v, v2);
1200                         break;
1201                 case InScope:
1202                         break;
1203                 }
1204                 return v;
1205         }
1206
1207         static void var_block_close(struct parse_context *c, enum closetype ct)
1208         {
1209                 /* Close off all variables that are in_scope */
1210                 struct variable *v, **vp, *v2;
1211
1212                 scope_pop(c);
1213                 for (vp = &c->in_scope;
1214                      v = *vp, v && v->depth > c->scope_depth && v->min_depth > c->scope_depth;
1215                      ) {
1216                         if (v->name->var == v) switch (ct) {
1217                         case CloseElse:
1218                         case CloseParallel: /* handle PendingScope */
1219                                 switch(v->scope) {
1220                                 case InScope:
1221                                 case CondScope:
1222                                         if (c->scope_stack->child_count == 1)
1223                                                 v->scope = PendingScope;
1224                                         else if (v->previous &&
1225                                                  v->previous->scope == PendingScope)
1226                                                 v->scope = PendingScope;
1227                                         else if (v->val.type == Tlabel)
1228                                                 v->scope = PendingScope;
1229                                         else if (v->name->var == v)
1230                                                 v->scope = OutScope;
1231                                         if (ct == CloseElse) {
1232                                                 /* All Pending variables with this name
1233                                                  * are now Conditional */
1234                                                 for (v2 = v;
1235                                                      v2 && v2->scope == PendingScope;
1236                                                      v2 = v2->previous)
1237                                                         v2->scope = CondScope;
1238                                         }
1239                                         break;
1240                                 case PendingScope:
1241                                         for (v2 = v;
1242                                              v2 && v2->scope == PendingScope;
1243                                              v2 = v2->previous)
1244                                                 if (v2->val.type != Tlabel)
1245                                                         v2->scope = OutScope;
1246                                         break;
1247                                 case OutScope: break;
1248                                 }
1249                                 break;
1250                         case CloseSequential:
1251                                 if (v->val.type == Tlabel)
1252                                         v->scope = PendingScope;
1253                                 switch (v->scope) {
1254                                 case InScope:
1255                                         v->scope = OutScope;
1256                                         break;
1257                                 case PendingScope:
1258                                         /* There was no 'else', so we can only become
1259                                          * conditional if we know the cases were exhaustive,
1260                                          * and that doesn't mean anything yet.
1261                                          * So only labels become conditional..
1262                                          */
1263                                         for (v2 = v;
1264                                              v2 && v2->scope == PendingScope;
1265                                              v2 = v2->previous)
1266                                                 if (v2->val.type == Tlabel) {
1267                                                         v2->scope = CondScope;
1268                                                         v2->min_depth = c->scope_depth;
1269                                                 } else
1270                                                         v2->scope = OutScope;
1271                                         break;
1272                                 case CondScope:
1273                                 case OutScope: break;
1274                                 }
1275                                 break;
1276                         }
1277                         if (v->scope == OutScope || v->name->var != v)
1278                                 *vp = v->in_scope;
1279                         else
1280                                 vp = &v->in_scope;
1281                 }
1282         }
1283
1284 ### Executables
1285
1286 Executables can be lots of different things.  In many cases an
1287 executable is just an operation combined with one or two other
1288 executables.  This allows for expressions and lists etc.  Other times
1289 an executable is something quite specific like a constant or variable
1290 name.  So we define a `struct exec` to be a general executable with a
1291 type, and a `struct binode` which is a subclass of `exec`, forms a
1292 node in a binary tree, and holds an operation. There will be other
1293 subclasses, and to access these we need to be able to `cast` the
1294 `exec` into the various other types.
1295
1296 ###### macros
1297         #define cast(structname, pointer) ({            \
1298                 const typeof( ((struct structname *)0)->type) *__mptr = &(pointer)->type; \
1299                 if (__mptr && *__mptr != X##structname) abort();                \
1300                 (struct structname *)( (char *)__mptr);})
1301
1302         #define new(structname) ({                                              \
1303                 struct structname *__ptr = ((struct structname *)calloc(1,sizeof(struct structname))); \
1304                 __ptr->type = X##structname;                                            \
1305                 __ptr->line = -1; __ptr->column = -1;                                   \
1306                 __ptr;})
1307
1308         #define new_pos(structname, token) ({                                           \
1309                 struct structname *__ptr = ((struct structname *)calloc(1,sizeof(struct structname))); \
1310                 __ptr->type = X##structname;                                            \
1311                 __ptr->line = token.line; __ptr->column = token.col;                    \
1312                 __ptr;})
1313
1314 ###### ast
1315         enum exec_types {
1316                 Xbinode,
1317                 ## exec type
1318         };
1319         struct exec {
1320                 enum exec_types type;
1321                 int line, column;
1322         };
1323         struct binode {
1324                 struct exec;
1325                 enum Btype {
1326                         ## Binode types
1327                 } op;
1328                 struct exec *left, *right;
1329         };
1330
1331 ###### ast functions
1332
1333         static int __fput_loc(struct exec *loc, FILE *f)
1334         {
1335                 if (!loc)
1336                         return 0;               // NOTEST
1337                 if (loc->line >= 0) {
1338                         fprintf(f, "%d:%d: ", loc->line, loc->column);
1339                         return 1;
1340                 }
1341                 if (loc->type == Xbinode)
1342                         return __fput_loc(cast(binode,loc)->left, f) ||
1343                                __fput_loc(cast(binode,loc)->right, f);
1344                 return 0;
1345         }
1346         static void fput_loc(struct exec *loc, FILE *f)
1347         {
1348                 if (!__fput_loc(loc, f))
1349                         fprintf(f, "??:??: ");  // NOTEST
1350         }
1351
1352 Each different type of `exec` node needs a number of functions
1353 defined, a bit like methods.  We must be able to be able to free it,
1354 print it, analyse it and execute it.  Once we have specific `exec`
1355 types we will need to parse them too.  Let's take this a bit more
1356 slowly.
1357
1358 #### Freeing
1359
1360 The parser generator requires a `free_foo` function for each struct
1361 that stores attributes and they will often be `exec`s and subtypes
1362 there-of.  So we need `free_exec` which can handle all the subtypes,
1363 and we need `free_binode`.
1364
1365 ###### ast functions
1366
1367         static void free_binode(struct binode *b)
1368         {
1369                 if (!b)
1370                         return;
1371                 free_exec(b->left);
1372                 free_exec(b->right);
1373                 free(b);
1374         }
1375
1376 ###### core functions
1377         static void free_exec(struct exec *e)
1378         {
1379                 if (!e)
1380                         return;
1381                 switch(e->type) {
1382                         ## free exec cases
1383                 }
1384         }
1385
1386 ###### forward decls
1387
1388         static void free_exec(struct exec *e);
1389
1390 ###### free exec cases
1391         case Xbinode: free_binode(cast(binode, e)); break;
1392
1393 #### Printing
1394
1395 Printing an `exec` requires that we know the current indent level for
1396 printing line-oriented components.  As will become clear later, we
1397 also want to know what sort of bracketing to use.
1398
1399 ###### ast functions
1400
1401         static void do_indent(int i, char *str)
1402         {
1403                 while (i--)
1404                         printf("    ");
1405                 printf("%s", str);
1406         }
1407
1408 ###### core functions
1409         static void print_binode(struct binode *b, int indent, int bracket)
1410         {
1411                 struct binode *b2;
1412                 switch(b->op) {
1413                 ## print binode cases
1414                 }
1415         }
1416
1417         static void print_exec(struct exec *e, int indent, int bracket)
1418         {
1419                 if (!e)
1420                         return;         // NOTEST
1421                 switch (e->type) {
1422                 case Xbinode:
1423                         print_binode(cast(binode, e), indent, bracket); break;
1424                 ## print exec cases
1425                 }
1426         }
1427
1428 ###### forward decls
1429
1430         static void print_exec(struct exec *e, int indent, int bracket);
1431
1432 #### Analysing
1433
1434 As discussed, analysis involves propagating type requirements around
1435 the program and looking for errors.
1436
1437 So `propagate_types` is passed an expected type (being a `struct type`
1438 pointer together with some `val_rules` flags) that the `exec` is
1439 expected to return, and returns the type that it does return, either
1440 of which can be `NULL` signifying "unknown".  An `ok` flag is passed
1441 by reference. It is set to `0` when an error is found, and `2` when
1442 any change is made.  If it remains unchanged at `1`, then no more
1443 propagation is needed.
1444
1445 ###### ast
1446
1447         enum val_rules {Rnolabel = 1<<0, Rboolok = 1<<1, Rnoconstant = 2<<1};
1448
1449 ###### format cases
1450         case 'r':
1451                 if (rules & Rnolabel)
1452                         fputs(" (labels not permitted)", stderr);
1453                 break;
1454
1455 ###### core functions
1456
1457         static struct type *propagate_types(struct exec *prog, struct parse_context *c, int *ok,
1458                                             struct type *type, int rules)
1459         {
1460                 struct type *t;
1461
1462                 if (!prog)
1463                         return Tnone;
1464
1465                 switch (prog->type) {
1466                 case Xbinode:
1467                 {
1468                         struct binode *b = cast(binode, prog);
1469                         switch (b->op) {
1470                         ## propagate binode cases
1471                         }
1472                         break;
1473                 }
1474                 ## propagate exec cases
1475                 }
1476                 return Tnone;
1477         }
1478
1479 #### Interpreting
1480
1481 Interpreting an `exec` doesn't require anything but the `exec`.  State
1482 is stored in variables and each variable will be directly linked from
1483 within the `exec` tree.  The exception to this is the whole `program`
1484 which needs to look at command line arguments.  The `program` will be
1485 interpreted separately.
1486
1487 Each `exec` can return a value, which may be `Tnone` but must be
1488 non-NULL;  Some `exec`s will return the location of a value, which can
1489 be updates.  To support this, each exec case must store either a value
1490 in `val` or the pointer to a value in `lval`.  If `lval` is set, but a
1491 simple value is required, `inter_exec()` will dereference `lval` to
1492 get the value.
1493
1494
1495 ###### core functions
1496
1497         struct lrval {
1498                 struct value val, *lval;
1499         };
1500
1501         static struct lrval _interp_exec(struct exec *e);
1502
1503         static struct value interp_exec(struct exec *e)
1504         {
1505                 struct lrval ret = _interp_exec(e);
1506
1507                 if (ret.lval)
1508                         return dup_value(*ret.lval);
1509                 else
1510                         return ret.val;
1511         }
1512
1513         static struct value *linterp_exec(struct exec *e)
1514         {
1515                 struct lrval ret = _interp_exec(e);
1516
1517                 return ret.lval;
1518         }
1519
1520         static struct lrval _interp_exec(struct exec *e)
1521         {
1522                 struct lrval ret;
1523                 struct value rv, *lrv = NULL;
1524                 rv.type = Tnone;
1525                 if (!e) {
1526                         ret.lval = lrv;
1527                         ret.val = rv;
1528                         return ret;
1529                 }
1530
1531                 switch(e->type) {
1532                 case Xbinode:
1533                 {
1534                         struct binode *b = cast(binode, e);
1535                         struct value left, right, *lleft;
1536                         left.type = right.type = Tnone;
1537                         switch (b->op) {
1538                         ## interp binode cases
1539                         }
1540                         free_value(left); free_value(right);
1541                         break;
1542                 }
1543                 ## interp exec cases
1544                 }
1545                 ret.lval = lrv;
1546                 ret.val = rv;
1547                 return ret;
1548         }
1549
1550 ### Complex types
1551
1552 Now that we have the shape of the interpreter in place we can add some
1553 complex types and connected them in to the data structures and the
1554 different phases of parse, analyse, print, interpret.
1555
1556 Thus far we have arrays and structs.
1557
1558 #### Arrays
1559
1560 Arrays can be declared by giving a size and a type, as `[size]type' so
1561 `freq:[26]number` declares `freq` to be an array of 26 numbers.  The
1562 size can be an arbitrary expression which is evaluated when the name
1563 comes into scope.
1564
1565 Arrays cannot be assigned.  When pointers are introduced we will also
1566 introduce array slices which can refer to part or all of an array -
1567 the assignment syntax will create a slice.  For now, an array can only
1568 ever be referenced by the name it is declared with.  It is likely that
1569 a "`copy`" primitive will eventually be define which can be used to
1570 make a copy of an array with controllable depth.
1571
1572 ###### type union fields
1573
1574         struct {
1575                 int size;
1576                 struct variable *vsize;
1577                 struct type *member;
1578         } array;
1579
1580 ###### value union fields
1581         struct {
1582                 struct value *elmnts;
1583         } array;
1584
1585 ###### value functions
1586
1587         static struct value array_prepare(struct type *type)
1588         {
1589                 struct value ret;
1590
1591                 ret.type = type;
1592                 ret.array.elmnts = NULL;
1593                 return ret;
1594         }
1595
1596         static struct value array_init(struct type *type)
1597         {
1598                 struct value ret;
1599                 int i;
1600
1601                 ret.type = type;
1602                 if (type->array.vsize) {
1603                         mpz_t q;
1604                         mpz_init(q);
1605                         mpz_tdiv_q(q, mpq_numref(type->array.vsize->val.num),
1606                                    mpq_denref(type->array.vsize->val.num));
1607                         type->array.size = mpz_get_si(q);
1608                         mpz_clear(q);
1609                 }
1610                 ret.array.elmnts = calloc(type->array.size,
1611                                           sizeof(ret.array.elmnts[0]));
1612                 for (i = 0; ret.array.elmnts && i < type->array.size; i++)
1613                         ret.array.elmnts[i] = val_init(type->array.member);
1614                 return ret;
1615         }
1616
1617         static void array_free(struct value val)
1618         {
1619                 int i;
1620
1621                 if (val.array.elmnts)
1622                         for (i = 0; i < val.type->array.size; i++)
1623                                 free_value(val.array.elmnts[i]);
1624                 free(val.array.elmnts);
1625         }
1626
1627         static int array_compat(struct type *require, struct type *have)
1628         {
1629                 if (have->compat != require->compat)
1630                         return 0;
1631                 /* Both are arrays, so we can look at details */
1632                 if (!type_compat(require->array.member, have->array.member, 0))
1633                         return 0;
1634                 if (require->array.vsize == NULL && have->array.vsize == NULL)
1635                         return require->array.size == have->array.size;
1636
1637                 return require->array.vsize == have->array.vsize;
1638         }
1639
1640         static void array_print_type(struct type *type, FILE *f)
1641         {
1642                 fputs("[", f);
1643                 if (type->array.vsize) {
1644                         struct binding *b = type->array.vsize->name;
1645                         fprintf(f, "%.*s]", b->name.len, b->name.txt);
1646                 } else
1647                         fprintf(f, "%d]", type->array.size);
1648                 type_print(type->array.member, f);
1649         }
1650
1651         static struct type array_prototype = {
1652                 .prepare = array_prepare,
1653                 .init = array_init,
1654                 .print_type = array_print_type,
1655                 .compat = array_compat,
1656                 .free = array_free,
1657         };
1658
1659 ###### type grammar
1660
1661         | [ NUMBER ] Type ${
1662                 $0 = calloc(1, sizeof(struct type));
1663                 *($0) = array_prototype;
1664                 $0->array.member = $<4;
1665                 $0->array.vsize = NULL;
1666                 {
1667                 struct parse_context *c = config2context(config);
1668                 char tail[3];
1669                 mpq_t num;
1670                 if (number_parse(num, tail, $2.txt) == 0)
1671                         tok_err(c, "error: unrecognised number", &$2);
1672                 else if (tail[0])
1673                         tok_err(c, "error: unsupported number suffix", &$2);
1674                 else {
1675                         $0->array.size = mpz_get_ui(mpq_numref(num));
1676                         if (mpz_cmp_ui(mpq_denref(num), 1) != 0) {
1677                                 tok_err(c, "error: array size must be an integer",
1678                                         &$2);
1679                         } else if (mpz_cmp_ui(mpq_numref(num), 1UL << 30) >= 0)
1680                                 tok_err(c, "error: array size is too large",
1681                                         &$2);
1682                         mpq_clear(num);
1683                 }
1684                 $0->next= c->anon_typelist;
1685                 c->anon_typelist = $0;
1686                 }
1687         }$
1688
1689         | [ IDENTIFIER ] Type ${ {
1690                 struct parse_context *c = config2context(config);
1691                 struct variable *v = var_ref(c, $2.txt);
1692
1693                 if (!v)
1694                         tok_err(config2context(config), "error: name undeclared", &$2);
1695                 else if (!v->constant)
1696                         tok_err(config2context(config), "error: array size must be a constant", &$2);
1697
1698                 $0 = calloc(1, sizeof(struct type));
1699                 *($0) = array_prototype;
1700                 $0->array.member = $<4;
1701                 $0->array.size = 0;
1702                 $0->array.vsize = v;
1703                 $0->next= c->anon_typelist;
1704                 c->anon_typelist = $0;
1705         } }$
1706
1707 ###### parse context
1708
1709         struct type *anon_typelist;
1710
1711 ###### free context types
1712
1713         while (context.anon_typelist) {
1714                 struct type *t = context.anon_typelist;
1715
1716                 context.anon_typelist = t->next;
1717                 free(t);
1718         }
1719
1720 ###### Binode types
1721         Index,
1722
1723 ###### variable grammar
1724
1725         | Variable [ Expression ] ${ {
1726                 struct binode *b = new(binode);
1727                 b->op = Index;
1728                 b->left = $<1;
1729                 b->right = $<3;
1730                 $0 = b;
1731         } }$
1732
1733 ###### print binode cases
1734         case Index:
1735                 print_exec(b->left, -1, 0);
1736                 printf("[");
1737                 print_exec(b->right, -1, 0);
1738                 printf("]");
1739                 break;
1740
1741 ###### propagate binode cases
1742         case Index:
1743                 /* left must be an array, right must be a number,
1744                  * result is the member type of the array
1745                  */
1746                 propagate_types(b->right, c, ok, Tnum, 0);
1747                 t = propagate_types(b->left, c, ok, NULL, rules & Rnoconstant);
1748                 if (!t || t->compat != array_compat) {
1749                         type_err(c, "error: %1 cannot be indexed", prog, t, 0, NULL);
1750                         *ok = 0;
1751                         return NULL;
1752                 } else {
1753                         if (!type_compat(type, t->array.member, rules)) {
1754                                 type_err(c, "error: have %1 but need %2", prog,
1755                                          t->array.member, rules, type);
1756                                 *ok = 0;
1757                         }
1758                         return t->array.member;
1759                 }
1760                 break;
1761
1762 ###### interp binode cases
1763         case Index: {
1764                 mpz_t q;
1765                 long i;
1766
1767                 lleft = linterp_exec(b->left);
1768                 right = interp_exec(b->right);
1769                 mpz_init(q);
1770                 mpz_tdiv_q(q, mpq_numref(right.num), mpq_denref(right.num));
1771                 i = mpz_get_si(q);
1772                 mpz_clear(q);
1773
1774                 if (i >= 0 && i < lleft->type->array.size)
1775                         lrv = &lleft->array.elmnts[i];
1776                 else
1777                         rv = val_init(lleft->type->array.member);
1778                 break;
1779         }
1780
1781 #### Structs
1782
1783 A `struct` is a data-type that contains one or more other data-types.
1784 It differs from an array in that each member can be of a different
1785 type, and they are accessed by name rather than by number.  Thus you
1786 cannot choose an element by calculation, you need to know what you
1787 want up-front.
1788
1789 The language makes no promises about how a given structure will be
1790 stored in memory - it is free to rearrange fields to suit whatever
1791 criteria seems important.
1792
1793 Structs are declared separately from program code - they cannot be
1794 declared in-line in a variable declaration like arrays can.  A struct
1795 is given a name and this name is used to identify the type - the name
1796 is not prefixed by the word `struct` as it would be in C.
1797
1798 Structs are only treated as the same if they have the same name.
1799 Simply having the same fields in the same order is not enough.  This
1800 might change once we can create structure initializes from a list of
1801 values.
1802
1803 Each component datum is identified much like a variable is declared,
1804 with a name, one or two colons, and a type.  The type cannot be omitted
1805 as there is no opportunity to deduce the type from usage.  An initial
1806 value can be given following an equals sign, so
1807
1808 ##### Example: a struct type
1809
1810         struct complex:
1811                 x:number = 0
1812                 y:number = 0
1813
1814 would declare a type called "complex" which has two number fields,
1815 each initialised to zero.
1816
1817 Struct will need to be declared separately from the code that uses
1818 them, so we will need to be able to print out the declaration of a
1819 struct when reprinting the whole program.  So a `print_type_decl` type
1820 function will be needed.
1821
1822 ###### type union fields
1823
1824         struct {
1825                 int nfields;
1826                 struct field {
1827                         struct text name;
1828                         struct type *type;
1829                         struct value init;
1830                 } *fields;
1831         } structure;
1832
1833 ###### value union fields
1834         struct {
1835                 struct value *fields;
1836         } structure;
1837
1838 ###### type functions
1839         void (*print_type_decl)(struct type *type, FILE *f);
1840
1841 ###### value functions
1842
1843         static struct value structure_prepare(struct type *type)
1844         {
1845                 struct value ret;
1846
1847                 ret.type = type;
1848                 ret.structure.fields = NULL;
1849                 return ret;
1850         }
1851
1852         static struct value structure_init(struct type *type)
1853         {
1854                 struct value ret;
1855                 int i;
1856
1857                 ret.type = type;
1858                 ret.structure.fields = calloc(type->structure.nfields,
1859                                               sizeof(ret.structure.fields[0]));
1860                 for (i = 0; ret.structure.fields && i < type->structure.nfields; i++)
1861                         ret.structure.fields[i] = val_init(type->structure.fields[i].type);
1862                 return ret;
1863         }
1864
1865         static void structure_free(struct value val)
1866         {
1867                 int i;
1868
1869                 if (val.structure.fields)
1870                         for (i = 0; i < val.type->structure.nfields; i++)
1871                                 free_value(val.structure.fields[i]);
1872                 free(val.structure.fields);
1873         }
1874
1875         static void structure_free_type(struct type *t)
1876         {
1877                 int i;
1878                 for (i = 0; i < t->structure.nfields; i++)
1879                         free_value(t->structure.fields[i].init);
1880                 free(t->structure.fields);
1881         }
1882
1883         static struct type structure_prototype = {
1884                 .prepare = structure_prepare,
1885                 .init = structure_init,
1886                 .free = structure_free,
1887                 .free_type = structure_free_type,
1888                 .print_type_decl = structure_print_type,
1889         };
1890
1891 ###### exec type
1892         Xfieldref,
1893
1894 ###### ast
1895         struct fieldref {
1896                 struct exec;
1897                 struct exec *left;
1898                 int index;
1899                 struct text name;
1900         };
1901
1902 ###### free exec cases
1903         case Xfieldref:
1904                 free_exec(cast(fieldref, e)->left);
1905                 free(e);
1906                 break;
1907
1908 ###### variable grammar
1909
1910         | Variable . IDENTIFIER ${ {
1911                 struct fieldref *fr = new_pos(fieldref, $2);
1912                 fr->left = $<1;
1913                 fr->name = $3.txt;
1914                 fr->index = -2;
1915                 $0 = fr;
1916         } }$
1917
1918 ###### print exec cases
1919
1920         case Xfieldref:
1921         {
1922                 struct fieldref *f = cast(fieldref, e);
1923                 print_exec(f->left, -1, 0);
1924                 printf(".%.*s", f->name.len, f->name.txt);
1925                 break;
1926         }
1927
1928 ###### ast functions
1929         static int find_struct_index(struct type *type, struct text field)
1930         {
1931                 int i;
1932                 for (i = 0; i < type->structure.nfields; i++)
1933                         if (text_cmp(type->structure.fields[i].name, field) == 0)
1934                                 return i;
1935                 return -1;
1936         }
1937
1938 ###### propagate exec cases
1939
1940         case Xfieldref:
1941         {
1942                 struct fieldref *f = cast(fieldref, prog);
1943                 struct type *st = propagate_types(f->left, c, ok, NULL, 0);
1944
1945                 if (!st)
1946                         type_err(c, "error: unknown type for field access", f->left,
1947                                  NULL, 0, NULL);
1948                 else if (st->prepare != structure_prepare)
1949                         type_err(c, "error: field reference attempted on %1, not a struct",
1950                                  f->left, st, 0, NULL);
1951                 else if (f->index == -2) {
1952                         f->index = find_struct_index(st, f->name);
1953                         if (f->index < 0) {
1954                                 type_err(c, "error: cannot find requested field in %1",
1955                                          f->left, st, 0, NULL);
1956                                 *ok = 0;
1957                         }
1958                 }
1959                 if (f->index >= 0) {
1960                         struct type *ft = st->structure.fields[f->index].type;
1961                         if (!type_compat(type, ft, rules)) {
1962                                 type_err(c, "error: have %1 but need %2", prog,
1963                                          ft, rules, type);
1964                                 *ok = 0;
1965                         }
1966                         return ft;
1967                 }
1968                 break;
1969         }
1970
1971 ###### interp exec cases
1972         case Xfieldref:
1973         {
1974                 struct fieldref *f = cast(fieldref, e);
1975                 struct value *lleft = linterp_exec(f->left);
1976                 lrv = &lleft->structure.fields[f->index];
1977                 break;
1978         }
1979
1980 ###### ast
1981         struct fieldlist {
1982                 struct fieldlist *prev;
1983                 struct field f;
1984         };
1985
1986 ###### ast functions
1987         static void free_fieldlist(struct fieldlist *f)
1988         {
1989                 if (!f)
1990                         return;
1991                 free_fieldlist(f->prev);
1992                 free_value(f->f.init);
1993                 free(f);
1994         }
1995
1996 ###### top level grammar
1997         DeclareStruct -> struct IDENTIFIER FieldBlock ${ {
1998                 struct type *t =
1999                         add_type(config2context(config), $2.txt, &structure_prototype);
2000                 int cnt = 0;
2001                 struct fieldlist *f;
2002
2003                 for (f = $3; f; f=f->prev)
2004                         cnt += 1;
2005
2006                 t->structure.nfields = cnt;
2007                 t->structure.fields = calloc(cnt, sizeof(struct field));
2008                 f = $3;
2009                 while (cnt > 0) {
2010                         cnt -= 1;
2011                         t->structure.fields[cnt] = f->f;
2012                         f->f.init = val_prepare(Tnone);
2013                         f = f->prev;
2014                 }
2015         } }$
2016
2017         $*fieldlist
2018         FieldBlock -> Open SimpleFieldList Close ${ $0 = $<2; }$
2019                 | Open Newlines SimpleFieldList Close ${ $0 = $<3; }$
2020                 | : FieldList  ${ $0 = $<2; }$
2021
2022         FieldList -> Field NEWLINE ${ $0 = $<1; }$
2023                 | FieldList NEWLINE ${ $0 = $<1; }$
2024                 | FieldList Field NEWLINE ${
2025                         $2->prev = $<1;
2026                         $0 = $<2;
2027                 }$
2028
2029         SimpleFieldList -> Field ; ${ $0 = $<1; }$
2030                 | SimpleFieldList Field ; ${
2031                         $2->prev = $<1;
2032                         $0 = $<2;
2033                 }$
2034
2035         Field -> IDENTIFIER : Type = Expression ${ {
2036                         int ok;
2037
2038                         $0 = calloc(1, sizeof(struct fieldlist));
2039                         $0->f.name = $1.txt;
2040                         $0->f.type = $<3;
2041                         $0->f.init = val_prepare($0->f.type);
2042                         do {
2043                                 ok = 1;
2044                                 propagate_types($<5, config2context(config), &ok, $3, 0);
2045                         } while (ok == 2);
2046                         if (!ok)
2047                                 config2context(config)->parse_error = 1;
2048                         else
2049                                 $0->f.init = interp_exec($5);
2050                 } }$
2051                 | IDENTIFIER : Type ${
2052                         $0 = calloc(1, sizeof(struct fieldlist));
2053                         $0->f.name = $1.txt;
2054                         $0->f.type = $<3;
2055                         $0->f.init = val_init($3);
2056                 }$
2057
2058 ###### forward decls
2059         static void structure_print_type(struct type *t, FILE *f);
2060
2061 ###### value functions
2062         static void structure_print_type(struct type *t, FILE *f)
2063         {
2064                 int i;
2065
2066                 fprintf(f, "struct %.*s:\n", t->name.len, t->name.txt);
2067
2068                 for (i = 0; i < t->structure.nfields; i++) {
2069                         struct field *fl = t->structure.fields + i;
2070                         fprintf(f, "    %.*s : ", fl->name.len, fl->name.txt);
2071                         type_print(fl->type, f);
2072                         if (fl->init.type->print) {
2073                                 fprintf(f, " = ");
2074                                 if (fl->init.type == Tstr)
2075                                         fprintf(f, "\"");
2076                                 print_value(fl->init);
2077                                 if (fl->init.type == Tstr)
2078                                         fprintf(f, "\"");
2079                         }
2080                         printf("\n");
2081                 }
2082         }
2083
2084 ###### print type decls
2085         {
2086                 struct type *t;
2087                 int target = -1;
2088
2089                 while (target != 0) {
2090                         int i = 0;
2091                         for (t = context.typelist; t ; t=t->next)
2092                                 if (t->print_type_decl) {
2093                                         i += 1;
2094                                         if (i == target)
2095                                                 break;
2096                                 }
2097
2098                         if (target == -1) {
2099                                 target = i;
2100                         } else {
2101                                 t->print_type_decl(t, stdout);
2102                                 target -= 1;
2103                         }
2104                 }
2105         }
2106
2107 ## Executables: the elements of code
2108
2109 Each code element needs to be parsed, printed, analysed,
2110 interpreted, and freed.  There are several, so let's just start with
2111 the easy ones and work our way up.
2112
2113 ### Values
2114
2115 We have already met values as separate objects.  When manifest
2116 constants appear in the program text, that must result in an executable
2117 which has a constant value.  So the `val` structure embeds a value in
2118 an executable.
2119
2120 ###### exec type
2121         Xval,
2122
2123 ###### ast
2124         struct val {
2125                 struct exec;
2126                 struct value val;
2127         };
2128
2129 ###### Grammar
2130
2131         $*val
2132         Value ->  True ${
2133                         $0 = new_pos(val, $1);
2134                         $0->val.type = Tbool;
2135                         $0->val.bool = 1;
2136                         }$
2137                 | False ${
2138                         $0 = new_pos(val, $1);
2139                         $0->val.type = Tbool;
2140                         $0->val.bool = 0;
2141                         }$
2142                 | NUMBER ${
2143                         $0 = new_pos(val, $1);
2144                         $0->val.type = Tnum;
2145                         {
2146                         char tail[3];
2147                         if (number_parse($0->val.num, tail, $1.txt) == 0)
2148                                 mpq_init($0->val.num);
2149                                 if (tail[0])
2150                                         tok_err(config2context(config), "error: unsupported number suffix",
2151                                                 &$1);
2152                         }
2153                         }$
2154                 | STRING ${
2155                         $0 = new_pos(val, $1);
2156                         $0->val.type = Tstr;
2157                         {
2158                         char tail[3];
2159                         string_parse(&$1, '\\', &$0->val.str, tail);
2160                         if (tail[0])
2161                                 tok_err(config2context(config), "error: unsupported string suffix",
2162                                         &$1);
2163                         }
2164                         }$
2165                 | MULTI_STRING ${
2166                         $0 = new_pos(val, $1);
2167                         $0->val.type = Tstr;
2168                         {
2169                         char tail[3];
2170                         string_parse(&$1, '\\', &$0->val.str, tail);
2171                         if (tail[0])
2172                                 tok_err(config2context(config), "error: unsupported string suffix",
2173                                         &$1);
2174                         }
2175                         }$
2176
2177 ###### print exec cases
2178         case Xval:
2179         {
2180                 struct val *v = cast(val, e);
2181                 if (v->val.type == Tstr)
2182                         printf("\"");
2183                 print_value(v->val);
2184                 if (v->val.type == Tstr)
2185                         printf("\"");
2186                 break;
2187         }
2188
2189 ###### propagate exec cases
2190         case Xval:
2191         {
2192                 struct val *val = cast(val, prog);
2193                 if (!type_compat(type, val->val.type, rules)) {
2194                         type_err(c, "error: expected %1%r found %2",
2195                                    prog, type, rules, val->val.type);
2196                         *ok = 0;
2197                 }
2198                 return val->val.type;
2199         }
2200
2201 ###### interp exec cases
2202         case Xval:
2203                 rv = dup_value(cast(val, e)->val);
2204                 break;
2205
2206 ###### ast functions
2207         static void free_val(struct val *v)
2208         {
2209                 if (!v)
2210                         return;
2211                 free_value(v->val);
2212                 free(v);
2213         }
2214
2215 ###### free exec cases
2216         case Xval: free_val(cast(val, e)); break;
2217
2218 ###### ast functions
2219         // Move all nodes from 'b' to 'rv', reversing the order.
2220         // In 'b' 'left' is a list, and 'right' is the last node.
2221         // In 'rv', left' is the first node and 'right' is a list.
2222         static struct binode *reorder_bilist(struct binode *b)
2223         {
2224                 struct binode *rv = NULL;
2225
2226                 while (b) {
2227                         struct exec *t = b->right;
2228                         b->right = rv;
2229                         rv = b;
2230                         if (b->left)
2231                                 b = cast(binode, b->left);
2232                         else
2233                                 b = NULL;
2234                         rv->left = t;
2235                 }
2236                 return rv;
2237         }
2238
2239 ### Variables
2240
2241 Just as we used a `val` to wrap a value into an `exec`, we similarly
2242 need a `var` to wrap a `variable` into an exec.  While each `val`
2243 contained a copy of the value, each `var` hold a link to the variable
2244 because it really is the same variable no matter where it appears.
2245 When a variable is used, we need to remember to follow the `->merged`
2246 link to find the primary instance.
2247
2248 ###### exec type
2249         Xvar,
2250
2251 ###### ast
2252         struct var {
2253                 struct exec;
2254                 struct variable *var;
2255         };
2256
2257 ###### Grammar
2258
2259         $*var
2260         VariableDecl -> IDENTIFIER : ${ {
2261                 struct variable *v = var_decl(config2context(config), $1.txt);
2262                 $0 = new_pos(var, $1);
2263                 $0->var = v;
2264                 if (v)
2265                         v->where_decl = $0;
2266                 else {
2267                         v = var_ref(config2context(config), $1.txt);
2268                         $0->var = v;
2269                         type_err(config2context(config), "error: variable '%v' redeclared",
2270                                  $0, NULL, 0, NULL);
2271                         type_err(config2context(config), "info: this is where '%v' was first declared",
2272                                  v->where_decl, NULL, 0, NULL);
2273                 }
2274         } }$
2275             | IDENTIFIER :: ${ {
2276                 struct variable *v = var_decl(config2context(config), $1.txt);
2277                 $0 = new_pos(var, $1);
2278                 $0->var = v;
2279                 if (v) {
2280                         v->where_decl = $0;
2281                         v->constant = 1;
2282                 } else {
2283                         v = var_ref(config2context(config), $1.txt);
2284                         $0->var = v;
2285                         type_err(config2context(config), "error: variable '%v' redeclared",
2286                                  $0, NULL, 0, NULL);
2287                         type_err(config2context(config), "info: this is where '%v' was first declared",
2288                                  v->where_decl, NULL, 0, NULL);
2289                 }
2290         } }$
2291             | IDENTIFIER : Type ${ {
2292                 struct variable *v = var_decl(config2context(config), $1.txt);
2293                 $0 = new_pos(var, $1);
2294                 $0->var = v;
2295                 if (v) {
2296                         v->where_decl = $0;
2297                         v->where_set = $0;
2298                         v->val = val_prepare($<3);
2299                 } else {
2300                         v = var_ref(config2context(config), $1.txt);
2301                         $0->var = v;
2302                         type_err(config2context(config), "error: variable '%v' redeclared",
2303                                  $0, NULL, 0, NULL);
2304                         type_err(config2context(config), "info: this is where '%v' was first declared",
2305                                  v->where_decl, NULL, 0, NULL);
2306                 }
2307         } }$
2308             | IDENTIFIER :: Type ${ {
2309                 struct variable *v = var_decl(config2context(config), $1.txt);
2310                 $0 = new_pos(var, $1);
2311                 $0->var = v;
2312                 if (v) {
2313                         v->where_decl = $0;
2314                         v->where_set = $0;
2315                         v->val = val_prepare($<3);
2316                         v->constant = 1;
2317                 } else {
2318                         v = var_ref(config2context(config), $1.txt);
2319                         $0->var = v;
2320                         type_err(config2context(config), "error: variable '%v' redeclared",
2321                                  $0, NULL, 0, NULL);
2322                         type_err(config2context(config), "info: this is where '%v' was first declared",
2323                                  v->where_decl, NULL, 0, NULL);
2324                 }
2325         } }$
2326
2327         $*exec
2328         Variable -> IDENTIFIER ${ {
2329                 struct variable *v = var_ref(config2context(config), $1.txt);
2330                 $0 = new_pos(var, $1);
2331                 if (v == NULL) {
2332                         /* This might be a label - allocate a var just in case */
2333                         v = var_decl(config2context(config), $1.txt);
2334                         if (v) {
2335                                 v->val = val_prepare(Tlabel);
2336                                 v->val.label = &v->val;
2337                                 v->where_set = $0;
2338                         }
2339                 }
2340                 cast(var, $0)->var = v;
2341         } }$
2342         ## variable grammar
2343
2344         $*type
2345         Type -> IDENTIFIER ${
2346                 $0 = find_type(config2context(config), $1.txt);
2347                 if (!$0) {
2348                         tok_err(config2context(config),
2349                                 "error: undefined type", &$1);
2350
2351                         $0 = Tnone;
2352                 }
2353         }$
2354         ## type grammar
2355
2356 ###### print exec cases
2357         case Xvar:
2358         {
2359                 struct var *v = cast(var, e);
2360                 if (v->var) {
2361                         struct binding *b = v->var->name;
2362                         printf("%.*s", b->name.len, b->name.txt);
2363                 }
2364                 break;
2365         }
2366
2367 ###### format cases
2368         case 'v':
2369                 if (loc->type == Xvar) {
2370                         struct var *v = cast(var, loc);
2371                         if (v->var) {
2372                                 struct binding *b = v->var->name;
2373                                 fprintf(stderr, "%.*s", b->name.len, b->name.txt);
2374                         } else
2375                                 fputs("???", stderr);   // NOTEST
2376                 } else
2377                         fputs("NOTVAR", stderr);        // NOTEST
2378                 break;
2379
2380 ###### propagate exec cases
2381
2382         case Xvar:
2383         {
2384                 struct var *var = cast(var, prog);
2385                 struct variable *v = var->var;
2386                 if (!v) {
2387                         type_err(c, "%d:BUG: no variable!!", prog, NULL, 0, NULL); // NOTEST
2388                         *ok = 0;                                        // NOTEST
2389                         return Tnone;                                   // NOTEST
2390                 }
2391                 if (v->merged)
2392                         v = v->merged;
2393                 if (v->constant && (rules & Rnoconstant)) {
2394                         type_err(c, "error: Cannot assign to a constant: %v",
2395                                  prog, NULL, 0, NULL);
2396                         type_err(c, "info: name was defined as a constant here",
2397                                  v->where_decl, NULL, 0, NULL);
2398                         *ok = 0;
2399                         return v->val.type;
2400                 }
2401                 if (v->val.type == NULL) {
2402                         if (type && *ok != 0) {
2403                                 v->val = val_prepare(type);
2404                                 v->where_set = prog;
2405                                 *ok = 2;
2406                         }
2407                         return type;
2408                 }
2409                 if (!type_compat(type, v->val.type, rules)) {
2410                         type_err(c, "error: expected %1%r but variable '%v' is %2", prog,
2411                                  type, rules, v->val.type);
2412                         type_err(c, "info: this is where '%v' was set to %1", v->where_set,
2413                                  v->val.type, rules, NULL);
2414                         *ok = 0;
2415                 }
2416                 if (!type)
2417                         return v->val.type;
2418                 return type;
2419         }
2420
2421 ###### interp exec cases
2422         case Xvar:
2423         {
2424                 struct var *var = cast(var, e);
2425                 struct variable *v = var->var;
2426
2427                 if (v->merged)
2428                         v = v->merged;
2429                 lrv = &v->val;
2430                 break;
2431         }
2432
2433 ###### ast functions
2434
2435         static void free_var(struct var *v)
2436         {
2437                 free(v);
2438         }
2439
2440 ###### free exec cases
2441         case Xvar: free_var(cast(var, e)); break;
2442
2443 ### Expressions: Conditional
2444
2445 Our first user of the `binode` will be conditional expressions, which
2446 is a bit odd as they actually have three components.  That will be
2447 handled by having 2 binodes for each expression.  The conditional
2448 expression is the lowest precedence operatior, so it gets to define
2449 what an "Expression" is.  The next level up is "BoolExpr", which
2450 comes next.
2451
2452 Conditional expressions are of the form "value `if` condition `else`
2453 other_value".  They associate to the right, so everything to the right
2454 of `else` is part of an else value, while only the BoolExpr to the
2455 left of `if` is the if values.  Between `if` and `else` there is no
2456 room for ambiguity, so a full conditional expression is allowed in there.
2457
2458 ###### Binode types
2459         CondExpr,
2460
2461 ###### Grammar
2462
2463         $*exec
2464         Expression -> BoolExpr if Expression else Expression ${ {
2465                         struct binode *b1 = new(binode);
2466                         struct binode *b2 = new(binode);
2467                         b1->op = CondExpr;
2468                         b1->left = $<3;
2469                         b1->right = b2;
2470                         b2->op = CondExpr;
2471                         b2->left = $<1;
2472                         b2->right = $<5;
2473                         $0 = b1;
2474                 } }$
2475                 | BoolExpr ${ $0 = $<1; }$
2476
2477 ###### print binode cases
2478
2479         case CondExpr:
2480                 b2 = cast(binode, b->right);
2481                 print_exec(b2->left, -1, 0);
2482                 printf(" if ");
2483                 print_exec(b->left, -1, 0);
2484                 printf(" else ");
2485                 print_exec(b2->right, -1, 0);
2486                 break;
2487
2488 ###### propagate binode cases
2489
2490         case CondExpr: {
2491                 /* cond must be Tbool, others must match */
2492                 struct binode *b2 = cast(binode, b->right);
2493                 struct type *t2;
2494
2495                 propagate_types(b->left, c, ok, Tbool, 0);
2496                 t = propagate_types(b2->left, c, ok, type, Rnolabel);
2497                 t2 = propagate_types(b2->right, c, ok, type ?: t, Rnolabel);
2498                 return t ?: t2;
2499         }
2500
2501 ###### interp binode cases
2502
2503         case CondExpr: {
2504                 struct binode *b2 = cast(binode, b->right);
2505                 left = interp_exec(b->left);
2506                 if (left.bool)
2507                         rv = interp_exec(b2->left);
2508                 else
2509                         rv = interp_exec(b2->right);
2510                 }
2511                 break;
2512
2513 ### Expressions: Boolean
2514
2515 The next class of expressions to use the `binode` will be Boolean
2516 expressions.  As I haven't implemented precedence in the parser
2517 generator yet, we need different names for each precedence level used
2518 by expressions.  The outer most or lowest level precedence after
2519 conditional expressions are Boolean operators which form an `BoolExpr`
2520 out of `BTerm`s and `BFact`s.  As well as `or` `and`, and `not` we
2521 have `and then` and `or else` which only evaluate the second operand
2522 if the result would make a difference.
2523
2524 ###### Binode types
2525         And,
2526         AndThen,
2527         Or,
2528         OrElse,
2529         Not,
2530
2531 ###### Grammar
2532
2533         $*exec
2534         BoolExpr -> BoolExpr or BTerm ${ {
2535                         struct binode *b = new(binode);
2536                         b->op = Or;
2537                         b->left = $<1;
2538                         b->right = $<3;
2539                         $0 = b;
2540                 } }$
2541                 | BoolExpr or else BTerm ${ {
2542                         struct binode *b = new(binode);
2543                         b->op = OrElse;
2544                         b->left = $<1;
2545                         b->right = $<4;
2546                         $0 = b;
2547                 } }$
2548                 | BTerm ${ $0 = $<1; }$
2549
2550         BTerm -> BTerm and BFact ${ {
2551                         struct binode *b = new(binode);
2552                         b->op = And;
2553                         b->left = $<1;
2554                         b->right = $<3;
2555                         $0 = b;
2556                 } }$
2557                 | BTerm and then BFact ${ {
2558                         struct binode *b = new(binode);
2559                         b->op = AndThen;
2560                         b->left = $<1;
2561                         b->right = $<4;
2562                         $0 = b;
2563                 } }$
2564                 | BFact ${ $0 = $<1; }$
2565
2566         BFact -> not BFact ${ {
2567                         struct binode *b = new(binode);
2568                         b->op = Not;
2569                         b->right = $<2;
2570                         $0 = b;
2571                 } }$
2572                 ## other BFact
2573
2574 ###### print binode cases
2575         case And:
2576                 print_exec(b->left, -1, 0);
2577                 printf(" and ");
2578                 print_exec(b->right, -1, 0);
2579                 break;
2580         case AndThen:
2581                 print_exec(b->left, -1, 0);
2582                 printf(" and then ");
2583                 print_exec(b->right, -1, 0);
2584                 break;
2585         case Or:
2586                 print_exec(b->left, -1, 0);
2587                 printf(" or ");
2588                 print_exec(b->right, -1, 0);
2589                 break;
2590         case OrElse:
2591                 print_exec(b->left, -1, 0);
2592                 printf(" or else ");
2593                 print_exec(b->right, -1, 0);
2594                 break;
2595         case Not:
2596                 printf("not ");
2597                 print_exec(b->right, -1, 0);
2598                 break;
2599
2600 ###### propagate binode cases
2601         case And:
2602         case AndThen:
2603         case Or:
2604         case OrElse:
2605         case Not:
2606                 /* both must be Tbool, result is Tbool */
2607                 propagate_types(b->left, c, ok, Tbool, 0);
2608                 propagate_types(b->right, c, ok, Tbool, 0);
2609                 if (type && type != Tbool) {
2610                         type_err(c, "error: %1 operation found where %2 expected", prog,
2611                                    Tbool, 0, type);
2612                         *ok = 0;
2613                 }
2614                 return Tbool;
2615
2616 ###### interp binode cases
2617         case And:
2618                 rv = interp_exec(b->left);
2619                 right = interp_exec(b->right);
2620                 rv.bool = rv.bool && right.bool;
2621                 break;
2622         case AndThen:
2623                 rv = interp_exec(b->left);
2624                 if (rv.bool)
2625                         rv = interp_exec(b->right);
2626                 break;
2627         case Or:
2628                 rv = interp_exec(b->left);
2629                 right = interp_exec(b->right);
2630                 rv.bool = rv.bool || right.bool;
2631                 break;
2632         case OrElse:
2633                 rv = interp_exec(b->left);
2634                 if (!rv.bool)
2635                         rv = interp_exec(b->right);
2636                 break;
2637         case Not:
2638                 rv = interp_exec(b->right);
2639                 rv.bool = !rv.bool;
2640                 break;
2641
2642 ### Expressions: Comparison
2643
2644 Of slightly higher precedence that Boolean expressions are
2645 Comparisons.
2646 A comparison takes arguments of any comparable type, but the two types must be
2647 the same.
2648
2649 To simplify the parsing we introduce an `eop` which can record an
2650 expression operator.
2651
2652 ###### ast
2653         struct eop {
2654                 enum Btype op;
2655         };
2656
2657 ###### ast functions
2658         static void free_eop(struct eop *e)
2659         {
2660                 if (e)
2661                         free(e);
2662         }
2663
2664 ###### Binode types
2665         Less,
2666         Gtr,
2667         LessEq,
2668         GtrEq,
2669         Eql,
2670         NEql,
2671
2672 ###### other BFact
2673         | Expr CMPop Expr ${ {
2674                 struct binode *b = new(binode);
2675                 b->op = $2.op;
2676                 b->left = $<1;
2677                 b->right = $<3;
2678                 $0 = b;
2679         } }$
2680         | Expr ${ $0 = $<1; }$
2681
2682 ###### Grammar
2683
2684         $eop
2685         CMPop ->   < ${ $0.op = Less; }$
2686                 |  > ${ $0.op = Gtr; }$
2687                 |  <= ${ $0.op = LessEq; }$
2688                 |  >= ${ $0.op = GtrEq; }$
2689                 |  == ${ $0.op = Eql; }$
2690                 |  != ${ $0.op = NEql; }$
2691
2692 ###### print binode cases
2693
2694         case Less:
2695         case LessEq:
2696         case Gtr:
2697         case GtrEq:
2698         case Eql:
2699         case NEql:
2700                 print_exec(b->left, -1, 0);
2701                 switch(b->op) {
2702                 case Less:   printf(" < "); break;
2703                 case LessEq: printf(" <= "); break;
2704                 case Gtr:    printf(" > "); break;
2705                 case GtrEq:  printf(" >= "); break;
2706                 case Eql:    printf(" == "); break;
2707                 case NEql:   printf(" != "); break;
2708                 default: abort();               // NOTEST
2709                 }
2710                 print_exec(b->right, -1, 0);
2711                 break;
2712
2713 ###### propagate binode cases
2714         case Less:
2715         case LessEq:
2716         case Gtr:
2717         case GtrEq:
2718         case Eql:
2719         case NEql:
2720                 /* Both must match but not be labels, result is Tbool */
2721                 t = propagate_types(b->left, c, ok, NULL, Rnolabel);
2722                 if (t)
2723                         propagate_types(b->right, c, ok, t, 0);
2724                 else {
2725                         t = propagate_types(b->right, c, ok, NULL, Rnolabel);
2726                         if (t)
2727                                 t = propagate_types(b->left, c, ok, t, 0);
2728                 }
2729                 if (!type_compat(type, Tbool, 0)) {
2730                         type_err(c, "error: Comparison returns %1 but %2 expected", prog,
2731                                     Tbool, rules, type);
2732                         *ok = 0;
2733                 }
2734                 return Tbool;
2735
2736 ###### interp binode cases
2737         case Less:
2738         case LessEq:
2739         case Gtr:
2740         case GtrEq:
2741         case Eql:
2742         case NEql:
2743         {
2744                 int cmp;
2745                 left = interp_exec(b->left);
2746                 right = interp_exec(b->right);
2747                 cmp = value_cmp(left, right);
2748                 rv.type = Tbool;
2749                 switch (b->op) {
2750                 case Less:      rv.bool = cmp <  0; break;
2751                 case LessEq:    rv.bool = cmp <= 0; break;
2752                 case Gtr:       rv.bool = cmp >  0; break;
2753                 case GtrEq:     rv.bool = cmp >= 0; break;
2754                 case Eql:       rv.bool = cmp == 0; break;
2755                 case NEql:      rv.bool = cmp != 0; break;
2756                 default: rv.bool = 0; break;    // NOTEST
2757                 }
2758                 break;
2759         }
2760
2761 ### Expressions: The rest
2762
2763 The remaining expressions with the highest precedence are arithmetic
2764 and string concatenation.  They are `Expr`, `Term`, and `Factor`.
2765 The `Factor` is where the `Value` and `Variable` that we already have
2766 are included.
2767
2768 `+` and `-` are both infix and prefix operations (where they are
2769 absolute value and negation).  These have different operator names.
2770
2771 We also have a 'Bracket' operator which records where parentheses were
2772 found.  This makes it easy to reproduce these when printing.  Once
2773 precedence is handled better I might be able to discard this.
2774
2775 ###### Binode types
2776         Plus, Minus,
2777         Times, Divide, Rem,
2778         Concat,
2779         Absolute, Negate,
2780         Bracket,
2781
2782 ###### Grammar
2783
2784         $*exec
2785         Expr -> Expr Eop Term ${ {
2786                         struct binode *b = new(binode);
2787                         b->op = $2.op;
2788                         b->left = $<1;
2789                         b->right = $<3;
2790                         $0 = b;
2791                 } }$
2792                 | Term ${ $0 = $<1; }$
2793
2794         Term -> Term Top Factor ${ {
2795                         struct binode *b = new(binode);
2796                         b->op = $2.op;
2797                         b->left = $<1;
2798                         b->right = $<3;
2799                         $0 = b;
2800                 } }$
2801                 | Factor ${ $0 = $<1; }$
2802
2803         Factor -> ( Expression ) ${ {
2804                         struct binode *b = new_pos(binode, $1);
2805                         b->op = Bracket;
2806                         b->right = $<2;
2807                         $0 = b;
2808                 } }$
2809                 | Uop Factor ${ {
2810                         struct binode *b = new(binode);
2811                         b->op = $1.op;
2812                         b->right = $<2;
2813                         $0 = b;
2814                 } }$
2815                 | Value ${ $0 = $<1; }$
2816                 | Variable ${ $0 = $<1; }$
2817
2818         $eop
2819         Eop ->    + ${ $0.op = Plus; }$
2820                 | - ${ $0.op = Minus; }$
2821
2822         Uop ->    + ${ $0.op = Absolute; }$
2823                 | - ${ $0.op = Negate; }$
2824
2825         Top ->    * ${ $0.op = Times; }$
2826                 | / ${ $0.op = Divide; }$
2827                 | % ${ $0.op = Rem; }$
2828                 | ++ ${ $0.op = Concat; }$
2829
2830 ###### print binode cases
2831         case Plus:
2832         case Minus:
2833         case Times:
2834         case Divide:
2835         case Concat:
2836         case Rem:
2837                 print_exec(b->left, indent, 0);
2838                 switch(b->op) {
2839                 case Plus:   fputs(" + ", stdout); break;
2840                 case Minus:  fputs(" - ", stdout); break;
2841                 case Times:  fputs(" * ", stdout); break;
2842                 case Divide: fputs(" / ", stdout); break;
2843                 case Rem:    fputs(" % ", stdout); break;
2844                 case Concat: fputs(" ++ ", stdout); break;
2845                 default: abort();       // NOTEST
2846                 }                       // NOTEST
2847                 print_exec(b->right, indent, 0);
2848                 break;
2849         case Absolute:
2850                 printf("+");
2851                 print_exec(b->right, indent, 0);
2852                 break;
2853         case Negate:
2854                 printf("-");
2855                 print_exec(b->right, indent, 0);
2856                 break;
2857         case Bracket:
2858                 printf("(");
2859                 print_exec(b->right, indent, 0);
2860                 printf(")");
2861                 break;
2862
2863 ###### propagate binode cases
2864         case Plus:
2865         case Minus:
2866         case Times:
2867         case Rem:
2868         case Divide:
2869                 /* both must be numbers, result is Tnum */
2870         case Absolute:
2871         case Negate:
2872                 /* as propagate_types ignores a NULL,
2873                  * unary ops fit here too */
2874                 propagate_types(b->left, c, ok, Tnum, 0);
2875                 propagate_types(b->right, c, ok, Tnum, 0);
2876                 if (!type_compat(type, Tnum, 0)) {
2877                         type_err(c, "error: Arithmetic returns %1 but %2 expected", prog,
2878                                    Tnum, rules, type);
2879                         *ok = 0;
2880                 }
2881                 return Tnum;
2882
2883         case Concat:
2884                 /* both must be Tstr, result is Tstr */
2885                 propagate_types(b->left, c, ok, Tstr, 0);
2886                 propagate_types(b->right, c, ok, Tstr, 0);
2887                 if (!type_compat(type, Tstr, 0)) {
2888                         type_err(c, "error: Concat returns %1 but %2 expected", prog,
2889                                    Tstr, rules, type);
2890                         *ok = 0;
2891                 }
2892                 return Tstr;
2893
2894         case Bracket:
2895                 return propagate_types(b->right, c, ok, type, 0);
2896
2897 ###### interp binode cases
2898
2899         case Plus:
2900                 rv = interp_exec(b->left);
2901                 right = interp_exec(b->right);
2902                 mpq_add(rv.num, rv.num, right.num);
2903                 break;
2904         case Minus:
2905                 rv = interp_exec(b->left);
2906                 right = interp_exec(b->right);
2907                 mpq_sub(rv.num, rv.num, right.num);
2908                 break;
2909         case Times:
2910                 rv = interp_exec(b->left);
2911                 right = interp_exec(b->right);
2912                 mpq_mul(rv.num, rv.num, right.num);
2913                 break;
2914         case Divide:
2915                 rv = interp_exec(b->left);
2916                 right = interp_exec(b->right);
2917                 mpq_div(rv.num, rv.num, right.num);
2918                 break;
2919         case Rem: {
2920                 mpz_t l, r, rem;
2921
2922                 left = interp_exec(b->left);
2923                 right = interp_exec(b->right);
2924                 mpz_init(l); mpz_init(r); mpz_init(rem);
2925                 mpz_tdiv_q(l, mpq_numref(left.num), mpq_denref(left.num));
2926                 mpz_tdiv_q(r, mpq_numref(right.num), mpq_denref(right.num));
2927                 mpz_tdiv_r(rem, l, r);
2928                 rv = val_init(Tnum);
2929                 mpq_set_z(rv.num, rem);
2930                 mpz_clear(r); mpz_clear(l); mpz_clear(rem);
2931                 break;
2932         }
2933         case Negate:
2934                 rv = interp_exec(b->right);
2935                 mpq_neg(rv.num, rv.num);
2936                 break;
2937         case Absolute:
2938                 rv = interp_exec(b->right);
2939                 mpq_abs(rv.num, rv.num);
2940                 break;
2941         case Bracket:
2942                 rv = interp_exec(b->right);
2943                 break;
2944         case Concat:
2945                 left = interp_exec(b->left);
2946                 right = interp_exec(b->right);
2947                 rv.type = Tstr;
2948                 rv.str = text_join(left.str, right.str);
2949                 break;
2950
2951
2952 ###### value functions
2953
2954         static struct text text_join(struct text a, struct text b)
2955         {
2956                 struct text rv;
2957                 rv.len = a.len + b.len;
2958                 rv.txt = malloc(rv.len);
2959                 memcpy(rv.txt, a.txt, a.len);
2960                 memcpy(rv.txt+a.len, b.txt, b.len);
2961                 return rv;
2962         }
2963
2964 ### Blocks, Statements, and Statement lists.
2965
2966 Now that we have expressions out of the way we need to turn to
2967 statements.  There are simple statements and more complex statements.
2968 Simple statements do not contain (syntactic) newlines, complex statements do.
2969
2970 Statements often come in sequences and we have corresponding simple
2971 statement lists and complex statement lists.
2972 The former comprise only simple statements separated by semicolons.
2973 The later comprise complex statements and simple statement lists.  They are
2974 separated by newlines.  Thus the semicolon is only used to separate
2975 simple statements on the one line.  This may be overly restrictive,
2976 but I'm not sure I ever want a complex statement to share a line with
2977 anything else.
2978
2979 Note that a simple statement list can still use multiple lines if
2980 subsequent lines are indented, so
2981
2982 ###### Example: wrapped simple statement list
2983
2984         a = b; c = d;
2985            e = f; print g
2986
2987 is a single simple statement list.  This might allow room for
2988 confusion, so I'm not set on it yet.
2989
2990 A simple statement list needs no extra syntax.  A complex statement
2991 list has two syntactic forms.  It can be enclosed in braces (much like
2992 C blocks), or it can be introduced by a colon and continue until an
2993 unindented newline (much like Python blocks).  With this extra syntax
2994 it is referred to as a block.
2995
2996 Note that a block does not have to include any newlines if it only
2997 contains simple statements.  So both of:
2998
2999         if condition: a=b; d=f
3000
3001         if condition { a=b; print f }
3002
3003 are valid.
3004
3005 In either case the list is constructed from a `binode` list with
3006 `Block` as the operator.  When parsing the list it is most convenient
3007 to append to the end, so a list is a list and a statement.  When using
3008 the list it is more convenient to consider a list to be a statement
3009 and a list.  So we need a function to re-order a list.
3010 `reorder_bilist` serves this purpose.
3011
3012 The only stand-alone statement we introduce at this stage is `pass`
3013 which does nothing and is represented as a `NULL` pointer in a `Block`
3014 list.  Other stand-alone statements will follow once the infrastructure
3015 is in-place.
3016
3017 ###### Binode types
3018         Block,
3019
3020 ###### Grammar
3021
3022         $void
3023         OptNL -> Newlines
3024                 |
3025
3026         Newlines -> NEWLINE
3027                 | Newlines NEWLINE
3028
3029         $*binode
3030         Open -> {
3031                 | NEWLINE {
3032         Close -> }
3033                 | NEWLINE }
3034         Block -> Open Statementlist Close ${ $0 = $<2; }$
3035                 | Open Newlines Statementlist Close ${ $0 = $<3; }$
3036                 | Open SimpleStatements } ${ $0 = reorder_bilist($<2); }$
3037                 | Open Newlines SimpleStatements } ${ $0 = reorder_bilist($<3); }$
3038                 | : Statementlist ${ $0 = $<2; }$
3039                 | : SimpleStatements ${ $0 = reorder_bilist($<2); }$
3040
3041         Statementlist -> ComplexStatements ${ $0 = reorder_bilist($<1); }$
3042
3043         ComplexStatements -> ComplexStatements ComplexStatement ${
3044                 $0 = new(binode);
3045                 $0->op = Block;
3046                 $0->left = $<1;
3047                 $0->right = $<2;
3048                 }$
3049                 | ComplexStatements NEWLINE ${ $0 = $<1; }$
3050                 | ComplexStatement ${
3051                 $0 = new(binode);
3052                 $0->op = Block;
3053                 $0->left = NULL;
3054                 $0->right = $<1;
3055                 }$
3056
3057         $*exec
3058         ComplexStatement -> SimpleStatements NEWLINE ${
3059                         $0 = reorder_bilist($<1);
3060                         }$
3061                 ## ComplexStatement Grammar
3062
3063         $*binode
3064         SimpleStatements -> SimpleStatements ; SimpleStatement ${
3065                         $0 = new(binode);
3066                         $0->op = Block;
3067                         $0->left = $<1;
3068                         $0->right = $<3;
3069                         }$
3070                 | SimpleStatement ${
3071                         $0 = new(binode);
3072                         $0->op = Block;
3073                         $0->left = NULL;
3074                         $0->right = $<1;
3075                         }$
3076                 | SimpleStatements ; ${ $0 = $<1; }$
3077
3078         SimpleStatement -> pass ${ $0 = NULL; }$
3079                 ## SimpleStatement Grammar
3080
3081 ###### print binode cases
3082         case Block:
3083                 if (indent < 0) {
3084                         // simple statement
3085                         if (b->left == NULL)
3086                                 printf("pass");
3087                         else
3088                                 print_exec(b->left, indent, 0);
3089                         if (b->right) {
3090                                 printf("; ");
3091                                 print_exec(b->right, indent, 0);
3092                         }
3093                 } else {
3094                         // block, one per line
3095                         if (b->left == NULL)
3096                                 do_indent(indent, "pass\n");
3097                         else
3098                                 print_exec(b->left, indent, bracket);
3099                         if (b->right)
3100                                 print_exec(b->right, indent, bracket);
3101                 }
3102                 break;
3103
3104 ###### propagate binode cases
3105         case Block:
3106         {
3107                 /* If any statement returns something other than Tnone
3108                  * or Tbool then all such must return same type.
3109                  * As each statement may be Tnone or something else,
3110                  * we must always pass NULL (unknown) down, otherwise an incorrect
3111                  * error might occur.  We never return Tnone unless it is
3112                  * passed in.
3113                  */
3114                 struct binode *e;
3115
3116                 for (e = b; e; e = cast(binode, e->right)) {
3117                         t = propagate_types(e->left, c, ok, NULL, rules);
3118                         if ((rules & Rboolok) && t == Tbool)
3119                                 t = NULL;
3120                         if (t && t != Tnone && t != Tbool) {
3121                                 if (!type)
3122                                         type = t;
3123                                 else if (t != type) {
3124                                         type_err(c, "error: expected %1%r, found %2",
3125                                                  e->left, type, rules, t);
3126                                         *ok = 0;
3127                                 }
3128                         }
3129                 }
3130                 return type;
3131         }
3132
3133 ###### interp binode cases
3134         case Block:
3135                 while (rv.type == Tnone &&
3136                        b) {
3137                         if (b->left)
3138                                 rv = interp_exec(b->left);
3139                         b = cast(binode, b->right);
3140                 }
3141                 break;
3142
3143 ### The Print statement
3144
3145 `print` is a simple statement that takes a comma-separated list of
3146 expressions and prints the values separated by spaces and terminated
3147 by a newline.  No control of formatting is possible.
3148
3149 `print` faces the same list-ordering issue as blocks, and uses the
3150 same solution.
3151
3152 ###### Binode types
3153         Print,
3154
3155 ###### SimpleStatement Grammar
3156
3157         | print ExpressionList ${
3158                 $0 = reorder_bilist($<2);
3159         }$
3160         | print ExpressionList , ${
3161                 $0 = new(binode);
3162                 $0->op = Print;
3163                 $0->right = NULL;
3164                 $0->left = $<2;
3165                 $0 = reorder_bilist($0);
3166         }$
3167         | print ${
3168                 $0 = new(binode);
3169                 $0->op = Print;
3170                 $0->right = NULL;
3171         }$
3172
3173 ###### Grammar
3174
3175         $*binode
3176         ExpressionList -> ExpressionList , Expression ${
3177                 $0 = new(binode);
3178                 $0->op = Print;
3179                 $0->left = $<1;
3180                 $0->right = $<3;
3181                 }$
3182                 | Expression ${
3183                         $0 = new(binode);
3184                         $0->op = Print;
3185                         $0->left = NULL;
3186                         $0->right = $<1;
3187                 }$
3188
3189 ###### print binode cases
3190
3191         case Print:
3192                 do_indent(indent, "print");
3193                 while (b) {
3194                         if (b->left) {
3195                                 printf(" ");
3196                                 print_exec(b->left, -1, 0);
3197                                 if (b->right)
3198                                         printf(",");
3199                         }
3200                         b = cast(binode, b->right);
3201                 }
3202                 if (indent >= 0)
3203                         printf("\n");
3204                 break;
3205
3206 ###### propagate binode cases
3207
3208         case Print:
3209                 /* don't care but all must be consistent */
3210                 propagate_types(b->left, c, ok, NULL, Rnolabel);
3211                 propagate_types(b->right, c, ok, NULL, Rnolabel);
3212                 break;
3213
3214 ###### interp binode cases
3215
3216         case Print:
3217         {
3218                 char sep = 0;
3219                 int eol = 1;
3220                 for ( ; b; b = cast(binode, b->right))
3221                         if (b->left) {
3222                                 if (sep)
3223                                         putchar(sep);
3224                                 left = interp_exec(b->left);
3225                                 print_value(left);
3226                                 free_value(left);
3227                                 if (b->right)
3228                                         sep = ' ';
3229                         } else if (sep)
3230                                 eol = 0;
3231                 left.type = Tnone;
3232                 if (eol)
3233                         printf("\n");
3234                 break;
3235         }
3236
3237 ###### Assignment statement
3238
3239 An assignment will assign a value to a variable, providing it hasn't
3240 be declared as a constant.  The analysis phase ensures that the type
3241 will be correct so the interpreter just needs to perform the
3242 calculation.  There is a form of assignment which declares a new
3243 variable as well as assigning a value.  If a name is assigned before
3244 it is declared, and error will be raised as the name is created as
3245 `Tlabel` and it is illegal to assign to such names.
3246
3247 ###### Binode types
3248         Assign,
3249         Declare,
3250
3251 ###### SimpleStatement Grammar
3252         | Variable = Expression ${
3253                         $0 = new(binode);
3254                         $0->op = Assign;
3255                         $0->left = $<1;
3256                         $0->right = $<3;
3257                 }$
3258         | VariableDecl = Expression ${
3259                         $0 = new(binode);
3260                         $0->op = Declare;
3261                         $0->left = $<1;
3262                         $0->right =$<3;
3263                 }$
3264
3265         | VariableDecl ${
3266                         if ($1->var->where_set == NULL) {
3267                                 type_err(config2context(config),
3268                                          "Variable declared with no type or value: %v",
3269                                          $1, NULL, 0, NULL);
3270                         } else {
3271                                 $0 = new(binode);
3272                                 $0->op = Declare;
3273                                 $0->left = $<1;
3274                                 $0->right = NULL;
3275                         }
3276                 }$
3277
3278 ###### print binode cases
3279
3280         case Assign:
3281                 do_indent(indent, "");
3282                 print_exec(b->left, indent, 0);
3283                 printf(" = ");
3284                 print_exec(b->right, indent, 0);
3285                 if (indent >= 0)
3286                         printf("\n");
3287                 break;
3288
3289         case Declare:
3290                 {
3291                 struct variable *v = cast(var, b->left)->var;
3292                 do_indent(indent, "");
3293                 print_exec(b->left, indent, 0);
3294                 if (cast(var, b->left)->var->constant) {
3295                         if (v->where_decl == v->where_set) {
3296                                 printf("::");
3297                                 type_print(v->val.type, stdout);
3298                                 printf(" ");
3299                         } else
3300                                 printf(" ::");
3301                 } else {
3302                         if (v->where_decl == v->where_set) {
3303                                 printf(":");
3304                                 type_print(v->val.type, stdout);
3305                                 printf(" ");
3306                         } else
3307                                 printf(" :");
3308                 }
3309                 if (b->right) {
3310                         printf("= ");
3311                         print_exec(b->right, indent, 0);
3312                 }
3313                 if (indent >= 0)
3314                         printf("\n");
3315                 }
3316                 break;
3317
3318 ###### propagate binode cases
3319
3320         case Assign:
3321         case Declare:
3322                 /* Both must match and not be labels,
3323                  * Type must support 'dup',
3324                  * For Assign, left must not be constant.
3325                  * result is Tnone
3326                  */
3327                 t = propagate_types(b->left, c, ok, NULL,
3328                                     Rnolabel | (b->op == Assign ? Rnoconstant : 0));
3329                 if (!b->right)
3330                         return Tnone;
3331
3332                 if (t) {
3333                         if (propagate_types(b->right, c, ok, t, 0) != t)
3334                                 if (b->left->type == Xvar)
3335                                         type_err(c, "info: variable '%v' was set as %1 here.",
3336                                                  cast(var, b->left)->var->where_set, t, rules, NULL);
3337                 } else {
3338                         t = propagate_types(b->right, c, ok, NULL, Rnolabel);
3339                         if (t)
3340                                 propagate_types(b->left, c, ok, t,
3341                                                 (b->op == Assign ? Rnoconstant : 0));
3342                 }
3343                 if (t && t->dup == NULL) {
3344                         type_err(c, "error: cannot assign value of type %1", b, t, 0, NULL);
3345                         *ok = 0;
3346                 }
3347                 return Tnone;
3348
3349                 break;
3350
3351 ###### interp binode cases
3352
3353         case Assign:
3354                 lleft = linterp_exec(b->left);
3355                 right = interp_exec(b->right);
3356                 if (lleft) {
3357                         free_value(*lleft);
3358                         *lleft = right;
3359                 } else
3360                         free_value(right);      // NOTEST
3361                 right.type = NULL;
3362                 break;
3363
3364         case Declare:
3365         {
3366                 struct variable *v = cast(var, b->left)->var;
3367                 if (v->merged)
3368                         v = v->merged;
3369                 if (b->right)
3370                         right = interp_exec(b->right);
3371                 else
3372                         right = val_init(v->val.type);
3373                 free_value(v->val);
3374                 v->val = right;
3375                 right.type = NULL;
3376                 break;
3377         }
3378
3379 ### The `use` statement
3380
3381 The `use` statement is the last "simple" statement.  It is needed when
3382 the condition in a conditional statement is a block.  `use` works much
3383 like `return` in C, but only completes the `condition`, not the whole
3384 function.
3385
3386 ###### Binode types
3387         Use,
3388
3389 ###### SimpleStatement Grammar
3390         | use Expression ${
3391                 $0 = new_pos(binode, $1);
3392                 $0->op = Use;
3393                 $0->right = $<2;
3394         }$
3395
3396 ###### print binode cases
3397
3398         case Use:
3399                 do_indent(indent, "use ");
3400                 print_exec(b->right, -1, 0);
3401                 if (indent >= 0)
3402                         printf("\n");
3403                 break;
3404
3405 ###### propagate binode cases
3406
3407         case Use:
3408                 /* result matches value */
3409                 return propagate_types(b->right, c, ok, type, 0);
3410
3411 ###### interp binode cases
3412
3413         case Use:
3414                 rv = interp_exec(b->right);
3415                 break;
3416
3417 ### The Conditional Statement
3418
3419 This is the biggy and currently the only complex statement.  This
3420 subsumes `if`, `while`, `do/while`, `switch`, and some parts of `for`.
3421 It is comprised of a number of parts, all of which are optional though
3422 set combinations apply.  Each part is (usually) a key word (`then` is
3423 sometimes optional) followed by either an expression or a code block,
3424 except the `casepart` which is a "key word and an expression" followed
3425 by a code block.  The code-block option is valid for all parts and,
3426 where an expression is also allowed, the code block can use the `use`
3427 statement to report a value.  If the code block does not report a value
3428 the effect is similar to reporting `True`.
3429
3430 The `else` and `case` parts, as well as `then` when combined with
3431 `if`, can contain a `use` statement which will apply to some
3432 containing conditional statement. `for` parts, `do` parts and `then`
3433 parts used with `for` can never contain a `use`, except in some
3434 subordinate conditional statement.
3435
3436 If there is a `forpart`, it is executed first, only once.
3437 If there is a `dopart`, then it is executed repeatedly providing
3438 always that the `condpart` or `cond`, if present, does not return a non-True
3439 value.  `condpart` can fail to return any value if it simply executes
3440 to completion.  This is treated the same as returning `True`.
3441
3442 If there is a `thenpart` it will be executed whenever the `condpart`
3443 or `cond` returns True (or does not return any value), but this will happen
3444 *after* `dopart` (when present).
3445
3446 If `elsepart` is present it will be executed at most once when the
3447 condition returns `False` or some value that isn't `True` and isn't
3448 matched by any `casepart`.  If there are any `casepart`s, they will be
3449 executed when the condition returns a matching value.
3450
3451 The particular sorts of values allowed in case parts has not yet been
3452 determined in the language design, so nothing is prohibited.
3453
3454 The various blocks in this complex statement potentially provide scope
3455 for variables as described earlier.  Each such block must include the
3456 "OpenScope" nonterminal before parsing the block, and must call
3457 `var_block_close()` when closing the block.
3458
3459 The code following "`if`", "`switch`" and "`for`" does not get its own
3460 scope, but is in a scope covering the whole statement, so names
3461 declared there cannot be redeclared elsewhere.  Similarly the
3462 condition following "`while`" is in a scope the covers the body
3463 ("`do`" part) of the loop, and which does not allow conditional scope
3464 extension.  Code following "`then`" (both looping and non-looping),
3465 "`else`" and "`case`" each get their own local scope.
3466
3467 The type requirements on the code block in a `whilepart` are quite
3468 unusal.  It is allowed to return a value of some identifiable type, in
3469 which case the loop aborts and an appropriate `casepart` is run, or it
3470 can return a Boolean, in which case the loop either continues to the
3471 `dopart` (on `True`) or aborts and runs the `elsepart` (on `False`).
3472 This is different both from the `ifpart` code block which is expected to
3473 return a Boolean, or the `switchpart` code block which is expected to
3474 return the same type as the casepart values.  The correct analysis of
3475 the type of the `whilepart` code block is the reason for the
3476 `Rboolok` flag which is passed to `propagate_types()`.
3477
3478 The `cond_statement` cannot fit into a `binode` so a new `exec` is
3479 defined.
3480
3481 ###### exec type
3482         Xcond_statement,
3483
3484 ###### ast
3485         struct casepart {
3486                 struct exec *value;
3487                 struct exec *action;
3488                 struct casepart *next;
3489         };
3490         struct cond_statement {
3491                 struct exec;
3492                 struct exec *forpart, *condpart, *dopart, *thenpart, *elsepart;
3493                 struct casepart *casepart;
3494         };
3495
3496 ###### ast functions
3497
3498         static void free_casepart(struct casepart *cp)
3499         {
3500                 while (cp) {
3501                         struct casepart *t;
3502                         free_exec(cp->value);
3503                         free_exec(cp->action);
3504                         t = cp->next;
3505                         free(cp);
3506                         cp = t;
3507                 }
3508         }
3509
3510         static void free_cond_statement(struct cond_statement *s)
3511         {
3512                 if (!s)
3513                         return;
3514                 free_exec(s->forpart);
3515                 free_exec(s->condpart);
3516                 free_exec(s->dopart);
3517                 free_exec(s->thenpart);
3518                 free_exec(s->elsepart);
3519                 free_casepart(s->casepart);
3520                 free(s);
3521         }
3522
3523 ###### free exec cases
3524         case Xcond_statement: free_cond_statement(cast(cond_statement, e)); break;
3525
3526 ###### ComplexStatement Grammar
3527         | CondStatement ${ $0 = $<1; }$
3528
3529 ###### Grammar
3530
3531         $*cond_statement
3532         // both ForThen and Whilepart open scopes, and CondSuffix only
3533         // closes one - so in the first branch here we have another to close.
3534         CondStatement -> ForThen WhilePart CondSuffix ${
3535                         $0 = $<3;
3536                         $0->forpart = $1.forpart; $1.forpart = NULL;
3537                         $0->thenpart = $1.thenpart; $1.thenpart = NULL;
3538                         $0->condpart = $2.condpart; $2.condpart = NULL;
3539                         $0->dopart = $2.dopart; $2.dopart = NULL;
3540                         var_block_close(config2context(config), CloseSequential);
3541                         }$
3542                 | WhilePart CondSuffix ${
3543                         $0 = $<2;
3544                         $0->condpart = $1.condpart; $1.condpart = NULL;
3545                         $0->dopart = $1.dopart; $1.dopart = NULL;
3546                         }$
3547                 | SwitchPart CondSuffix ${
3548                         $0 = $<2;
3549                         $0->condpart = $<1;
3550                         }$
3551                 | IfPart IfSuffix ${
3552                         $0 = $<2;
3553                         $0->condpart = $1.condpart; $1.condpart = NULL;
3554                         $0->thenpart = $1.thenpart; $1.thenpart = NULL;
3555                         // This is where we close an "if" statement
3556                         var_block_close(config2context(config), CloseSequential);
3557                         }$
3558
3559         CondSuffix -> IfSuffix ${
3560                         $0 = $<1;
3561                         // This is where we close scope of the whole
3562                         // "for" or "while" statement
3563                         var_block_close(config2context(config), CloseSequential);
3564                 }$
3565                 | CasePart CondSuffix ${
3566                         $0 = $<2;
3567                         $1->next = $0->casepart;
3568                         $0->casepart = $<1;
3569                 }$
3570
3571         $*casepart
3572         CasePart -> Newlines case Expression OpenScope Block ${
3573                         $0 = calloc(1,sizeof(struct casepart));
3574                         $0->value = $<3;
3575                         $0->action = $<5;
3576                         var_block_close(config2context(config), CloseParallel);
3577                 }$
3578                 | case Expression OpenScope Block ${
3579                         $0 = calloc(1,sizeof(struct casepart));
3580                         $0->value = $<2;
3581                         $0->action = $<4;
3582                         var_block_close(config2context(config), CloseParallel);
3583                 }$
3584
3585         $*cond_statement
3586         IfSuffix -> Newlines ${ $0 = new(cond_statement); }$
3587                 | Newlines else OpenScope Block ${
3588                         $0 = new(cond_statement);
3589                         $0->elsepart = $<4;
3590                         var_block_close(config2context(config), CloseElse);
3591                 }$
3592                 | else OpenScope Block ${
3593                         $0 = new(cond_statement);
3594                         $0->elsepart = $<3;
3595                         var_block_close(config2context(config), CloseElse);
3596                 }$
3597                 | Newlines else OpenScope CondStatement ${
3598                         $0 = new(cond_statement);
3599                         $0->elsepart = $<4;
3600                         var_block_close(config2context(config), CloseElse);
3601                 }$
3602                 | else OpenScope CondStatement ${
3603                         $0 = new(cond_statement);
3604                         $0->elsepart = $<3;
3605                         var_block_close(config2context(config), CloseElse);
3606                 }$
3607
3608
3609         $*exec
3610         // These scopes are closed in CondSuffix
3611         ForPart -> for OpenScope SimpleStatements ${
3612                         $0 = reorder_bilist($<3);
3613                 }$
3614                 |  for OpenScope Block ${
3615                         $0 = $<3;
3616                 }$
3617
3618         ThenPart -> then OpenScope SimpleStatements ${
3619                         $0 = reorder_bilist($<3);
3620                         var_block_close(config2context(config), CloseSequential);
3621                 }$
3622                 |  then OpenScope Block ${
3623                         $0 = $<3;
3624                         var_block_close(config2context(config), CloseSequential);
3625                 }$
3626
3627         ThenPartNL -> ThenPart OptNL ${
3628                         $0 = $<1;
3629                 }$
3630
3631         // This scope is closed in CondSuffix
3632         WhileHead -> while OpenScope Block ${
3633                 $0 = $<3;
3634                 }$
3635
3636         $cond_statement
3637         ForThen -> ForPart OptNL ThenPartNL ${
3638                         $0.forpart = $<1;
3639                         $0.thenpart = $<3;
3640                 }$
3641                 | ForPart OptNL ${
3642                         $0.forpart = $<1;
3643                 }$
3644
3645         // This scope is closed in CondSuffix
3646         WhilePart -> while OpenScope Expression Block ${
3647                         $0.type = Xcond_statement;
3648                         $0.condpart = $<3;
3649                         $0.dopart = $<4;
3650                 }$
3651                 | WhileHead OptNL do Block ${
3652                         $0.type = Xcond_statement;
3653                         $0.condpart = $<1;
3654                         $0.dopart = $<4;
3655                 }$
3656
3657         IfPart -> if OpenScope Expression OpenScope Block ${
3658                         $0.type = Xcond_statement;
3659                         $0.condpart = $<3;
3660                         $0.thenpart = $<5;
3661                         var_block_close(config2context(config), CloseParallel);
3662                 }$
3663                 | if OpenScope Block OptNL then OpenScope Block ${
3664                         $0.type = Xcond_statement;
3665                         $0.condpart = $<3;
3666                         $0.thenpart = $<7;
3667                         var_block_close(config2context(config), CloseParallel);
3668                 }$
3669
3670         $*exec
3671         // This scope is closed in CondSuffix
3672         SwitchPart -> switch OpenScope Expression ${
3673                         $0 = $<3;
3674                 }$
3675                 | switch OpenScope Block ${
3676                         $0 = $<3;
3677                 }$
3678
3679 ###### print exec cases
3680
3681         case Xcond_statement:
3682         {
3683                 struct cond_statement *cs = cast(cond_statement, e);
3684                 struct casepart *cp;
3685                 if (cs->forpart) {
3686                         do_indent(indent, "for");
3687                         if (bracket) printf(" {\n"); else printf(":\n");
3688                         print_exec(cs->forpart, indent+1, bracket);
3689                         if (cs->thenpart) {
3690                                 if (bracket)
3691                                         do_indent(indent, "} then {\n");
3692                                 else
3693                                         do_indent(indent, "then:\n");
3694                                 print_exec(cs->thenpart, indent+1, bracket);
3695                         }
3696                         if (bracket) do_indent(indent, "}\n");
3697                 }
3698                 if (cs->dopart) {
3699                         // a loop
3700                         if (cs->condpart && cs->condpart->type == Xbinode &&
3701                             cast(binode, cs->condpart)->op == Block) {
3702                                 if (bracket)
3703                                         do_indent(indent, "while {\n");
3704                                 else
3705                                         do_indent(indent, "while:\n");
3706                                 print_exec(cs->condpart, indent+1, bracket);
3707                                 if (bracket)
3708                                         do_indent(indent, "} do {\n");
3709                                 else
3710                                         do_indent(indent, "do:\n");
3711                                 print_exec(cs->dopart, indent+1, bracket);
3712                                 if (bracket)
3713                                         do_indent(indent, "}\n");
3714                         } else {
3715                                 do_indent(indent, "while ");
3716                                 print_exec(cs->condpart, 0, bracket);
3717                                 if (bracket)
3718                                         printf(" {\n");
3719                                 else
3720                                         printf(":\n");
3721                                 print_exec(cs->dopart, indent+1, bracket);
3722                                 if (bracket)
3723                                         do_indent(indent, "}\n");
3724                         }
3725                 } else {
3726                         // a condition
3727                         if (cs->casepart)
3728                                 do_indent(indent, "switch");
3729                         else
3730                                 do_indent(indent, "if");
3731                         if (cs->condpart && cs->condpart->type == Xbinode &&
3732                             cast(binode, cs->condpart)->op == Block) {
3733                                 if (bracket)
3734                                         printf(" {\n");
3735                                 else
3736                                         printf(":\n");
3737                                 print_exec(cs->condpart, indent+1, bracket);
3738                                 if (bracket)
3739                                         do_indent(indent, "}\n");
3740                                 if (cs->thenpart) {
3741                                         do_indent(indent, "then:\n");
3742                                         print_exec(cs->thenpart, indent+1, bracket);
3743                                 }
3744                         } else {
3745                                 printf(" ");
3746                                 print_exec(cs->condpart, 0, bracket);
3747                                 if (cs->thenpart) {
3748                                         if (bracket)
3749                                                 printf(" {\n");
3750                                         else
3751                                                 printf(":\n");
3752                                         print_exec(cs->thenpart, indent+1, bracket);
3753                                         if (bracket)
3754                                                 do_indent(indent, "}\n");
3755                                 } else
3756                                         printf("\n");
3757                         }
3758                 }
3759                 for (cp = cs->casepart; cp; cp = cp->next) {
3760                         do_indent(indent, "case ");
3761                         print_exec(cp->value, -1, 0);
3762                         if (bracket)
3763                                 printf(" {\n");
3764                         else
3765                                 printf(":\n");
3766                         print_exec(cp->action, indent+1, bracket);
3767                         if (bracket)
3768                                 do_indent(indent, "}\n");
3769                 }
3770                 if (cs->elsepart) {
3771                         do_indent(indent, "else");
3772                         if (bracket)
3773                                 printf(" {\n");
3774                         else
3775                                 printf(":\n");
3776                         print_exec(cs->elsepart, indent+1, bracket);
3777                         if (bracket)
3778                                 do_indent(indent, "}\n");
3779                 }
3780                 break;
3781         }
3782
3783 ###### propagate exec cases
3784         case Xcond_statement:
3785         {
3786                 // forpart and dopart must return Tnone
3787                 // thenpart must return Tnone if there is a dopart,
3788                 // otherwise it is like elsepart.
3789                 // condpart must:
3790                 //    be bool if there is no casepart
3791                 //    match casepart->values if there is a switchpart
3792                 //    either be bool or match casepart->value if there
3793                 //             is a whilepart
3794                 // elsepart and casepart->action must match the return type
3795                 //   expected of this statement.
3796                 struct cond_statement *cs = cast(cond_statement, prog);
3797                 struct casepart *cp;
3798
3799                 t = propagate_types(cs->forpart, c, ok, Tnone, 0);
3800                 if (!type_compat(Tnone, t, 0))
3801                         *ok = 0;
3802                 t = propagate_types(cs->dopart, c, ok, Tnone, 0);
3803                 if (!type_compat(Tnone, t, 0))
3804                         *ok = 0;
3805                 if (cs->dopart) {
3806                         t = propagate_types(cs->thenpart, c, ok, Tnone, 0);
3807                         if (!type_compat(Tnone, t, 0))
3808                                 *ok = 0;
3809                 }
3810                 if (cs->casepart == NULL)
3811                         propagate_types(cs->condpart, c, ok, Tbool, 0);
3812                 else {
3813                         /* Condpart must match case values, with bool permitted */
3814                         t = NULL;
3815                         for (cp = cs->casepart;
3816                              cp && !t; cp = cp->next)
3817                                 t = propagate_types(cp->value, c, ok, NULL, 0);
3818                         if (!t && cs->condpart)
3819                                 t = propagate_types(cs->condpart, c, ok, NULL, Rboolok);
3820                         // Now we have a type (I hope) push it down
3821                         if (t) {
3822                                 for (cp = cs->casepart; cp; cp = cp->next)
3823                                         propagate_types(cp->value, c, ok, t, 0);
3824                                 propagate_types(cs->condpart, c, ok, t, Rboolok);
3825                         }
3826                 }
3827                 // (if)then, else, and case parts must return expected type.
3828                 if (!cs->dopart && !type)
3829                         type = propagate_types(cs->thenpart, c, ok, NULL, rules);
3830                 if (!type)
3831                         type = propagate_types(cs->elsepart, c, ok, NULL, rules);
3832                 for (cp = cs->casepart;
3833                      cp && !type;
3834                      cp = cp->next)
3835                         type = propagate_types(cp->action, c, ok, NULL, rules);
3836                 if (type) {
3837                         if (!cs->dopart)
3838                                 propagate_types(cs->thenpart, c, ok, type, rules);
3839                         propagate_types(cs->elsepart, c, ok, type, rules);
3840                         for (cp = cs->casepart; cp ; cp = cp->next)
3841                                 propagate_types(cp->action, c, ok, type, rules);
3842                         return type;
3843                 } else
3844                         return NULL;
3845         }
3846
3847 ###### interp exec cases
3848         case Xcond_statement:
3849         {
3850                 struct value v, cnd;
3851                 struct casepart *cp;
3852                 struct cond_statement *c = cast(cond_statement, e);
3853
3854                 if (c->forpart)
3855                         interp_exec(c->forpart);
3856                 do {
3857                         if (c->condpart)
3858                                 cnd = interp_exec(c->condpart);
3859                         else
3860                                 cnd.type = Tnone;
3861                         if (!(cnd.type == Tnone ||
3862                               (cnd.type == Tbool && cnd.bool != 0)))
3863                                 break;
3864                         // cnd is Tnone or Tbool, doesn't need to be freed
3865                         if (c->dopart)
3866                                 interp_exec(c->dopart);
3867
3868                         if (c->thenpart) {
3869                                 rv = interp_exec(c->thenpart);
3870                                 if (rv.type != Tnone || !c->dopart)
3871                                         goto Xcond_done;
3872                                 free_value(rv);
3873                         }
3874                 } while (c->dopart);
3875
3876                 for (cp = c->casepart; cp; cp = cp->next) {
3877                         v = interp_exec(cp->value);
3878                         if (value_cmp(v, cnd) == 0) {
3879                                 free_value(v);
3880                                 free_value(cnd);
3881                                 rv = interp_exec(cp->action);
3882                                 goto Xcond_done;
3883                         }
3884                         free_value(v);
3885                 }
3886                 free_value(cnd);
3887                 if (c->elsepart)
3888                         rv = interp_exec(c->elsepart);
3889                 else
3890                         rv.type = Tnone;
3891         Xcond_done:
3892                 break;
3893         }
3894
3895 ### Top level structure
3896
3897 All the language elements so far can be used in various places.  Now
3898 it is time to clarify what those places are.
3899
3900 At the top level of a file there will be a number of declarations.
3901 Many of the things that can be declared haven't been described yet,
3902 such as functions, procedures, imports, and probably more.
3903 For now there are two sorts of things that can appear at the top
3904 level.  They are predefined constants, `struct` types, and the main
3905 program.  While the syntax will allow the main program to appear
3906 multiple times, that will trigger an error if it is actually attempted.
3907
3908 The various declarations do not return anything.  They store the
3909 various declarations in the parse context.
3910
3911 ###### Parser: grammar
3912
3913         $void
3914         Ocean -> DeclarationList
3915
3916         DeclarationList -> Declaration
3917                 | DeclarationList Declaration
3918
3919         Declaration -> DeclareConstant
3920                 | DeclareProgram
3921                 | DeclareStruct
3922                 | NEWLINE
3923
3924         ## top level grammar
3925
3926 ### The `const` section
3927
3928 As well as being defined in with the code that uses them, constants
3929 can be declared at the top level.  These have full-file scope, so they
3930 are always `InScope`.  The value of a top level constant can be given
3931 as an expression, and this is evaluated immediately rather than in the
3932 later interpretation stage.  Once we add functions to the language, we
3933 will need rules concern which, if any, can be used to define a top
3934 level constant.
3935
3936 Constants are defined in a section that starts with the reserved word
3937 `const` and then has a block with a list of assignment statements.
3938 For syntactic consistency, these must use the double-colon syntax to
3939 make it clear that they are constants.  Type can also be given: if
3940 not, the type will be determined during analysis, as with other
3941 constants.
3942
3943 As the types constants are inserted at the head of a list, printing
3944 them in the same order that they were read is not straight forward.
3945 We take a quadratic approach here and count the number of constants
3946 (variables of depth 0), then count down from there, each time
3947 searching through for the Nth constant for decreasing N.
3948
3949 ###### top level grammar
3950
3951         DeclareConstant -> const Open ConstList Close
3952                 | const Open Newlines ConstList Close
3953                 | const Open SimpleConstList }
3954                 | const Open Newlines SimpleConstList }
3955                 | const : ConstList
3956                 | const SimpleConstList
3957
3958         ConstList -> ComplexConsts
3959         ComplexConsts -> ComplexConst ComplexConsts
3960                 | ComplexConst
3961         ComplexConst -> SimpleConstList NEWLINE
3962         SimpleConstList -> Const ; SimpleConstList
3963                 | Const
3964                 | Const ; SimpleConstList ;
3965
3966         $*type
3967         CType -> Type   ${ $0 = $<1; }$
3968                 |       ${ $0 = NULL; }$
3969         $void
3970         Const -> IDENTIFIER :: CType = Expression ${ {
3971                 int ok;
3972                 struct variable *v;
3973
3974                 v = var_decl(config2context(config), $1.txt);
3975                 if (v) {
3976                         struct var *var = new_pos(var, $1);
3977                         v->where_decl = var;
3978                         v->where_set = var;
3979                         var->var = v;
3980                         v->constant = 1;
3981                 } else {
3982                         v = var_ref(config2context(config), $1.txt);
3983                         tok_err(config2context(config), "error: name already declared", &$1);
3984                         type_err(config2context(config), "info: this is where '%v' was first declared",
3985                                  v->where_decl, NULL, 0, NULL);
3986                 }
3987                 do {
3988                         ok = 1;
3989                         propagate_types($5, config2context(config), &ok, $3, 0);
3990                 } while (ok == 2);
3991                 if (!ok)
3992                         config2context(config)->parse_error = 1;
3993                 else if (v) {
3994                         v->val = interp_exec($5);
3995                 }
3996         } }$
3997
3998 ###### print const decls
3999         {
4000                 struct variable *v;
4001                 int target = -1;
4002
4003                 while (target != 0) {
4004                         int i = 0;
4005                         for (v = context.in_scope; v; v=v->in_scope)
4006                                 if (v->depth == 0) {
4007                                         i += 1;
4008                                         if (i == target)
4009                                                 break;
4010                                 }
4011
4012                         if (target == -1) {
4013                                 if (i)
4014                                         printf("const:\n");
4015                                 target = i;
4016                         } else {
4017                                 printf("    %.*s :: ", v->name->name.len, v->name->name.txt);
4018                                 type_print(v->val.type, stdout);
4019                                 printf(" = ");
4020                                 if (v->val.type == Tstr)
4021                                         printf("\"");
4022                                 print_value(v->val);
4023                                 if (v->val.type == Tstr)
4024                                         printf("\"");
4025                                 printf("\n");
4026                                 target -= 1;
4027                         }
4028                 }
4029         }
4030
4031 ### Finally the whole program.
4032
4033 Somewhat reminiscent of Pascal a (current) Ocean program starts with
4034 the keyword "program" and a list of variable names which are assigned
4035 values from command line arguments.  Following this is a `block` which
4036 is the code to execute.  Unlike Pascal, constants and other
4037 declarations come *before* the program.
4038
4039 As this is the top level, several things are handled a bit
4040 differently.
4041 The whole program is not interpreted by `interp_exec` as that isn't
4042 passed the argument list which the program requires.  Similarly type
4043 analysis is a bit more interesting at this level.
4044
4045 ###### Binode types
4046         Program,
4047
4048 ###### top level grammar
4049
4050         DeclareProgram -> Program ${ {
4051                 struct parse_context *c = config2context(config);
4052                 if (c->prog)
4053                         type_err(c, "Program defined a second time",
4054                                  $1, NULL, 0, NULL);
4055                 else
4056                         c->prog = $<1;
4057         } }$
4058
4059
4060         $*binode
4061         Program -> program OpenScope Varlist Block OptNL ${
4062                 $0 = new(binode);
4063                 $0->op = Program;
4064                 $0->left = reorder_bilist($<3);
4065                 $0->right = $<4;
4066                 var_block_close(config2context(config), CloseSequential);
4067                 if (config2context(config)->scope_stack) abort();
4068                 }$
4069                 | ERROR ${
4070                         tok_err(config2context(config),
4071                                 "error: unhandled parse error", &$1);
4072                 }$
4073
4074         Varlist -> Varlist ArgDecl ${
4075                         $0 = new(binode);
4076                         $0->op = Program;
4077                         $0->left = $<1;
4078                         $0->right = $<2;
4079                 }$
4080                 | ${ $0 = NULL; }$
4081
4082         $*var
4083         ArgDecl -> IDENTIFIER ${ {
4084                 struct variable *v = var_decl(config2context(config), $1.txt);
4085                 $0 = new(var);
4086                 $0->var = v;
4087         } }$
4088
4089         ## Grammar
4090
4091 ###### print binode cases
4092         case Program:
4093                 do_indent(indent, "program");
4094                 for (b2 = cast(binode, b->left); b2; b2 = cast(binode, b2->right)) {
4095                         printf(" ");
4096                         print_exec(b2->left, 0, 0);
4097                 }
4098                 if (bracket)
4099                         printf(" {\n");
4100                 else
4101                         printf(":\n");
4102                 print_exec(b->right, indent+1, bracket);
4103                 if (bracket)
4104                         do_indent(indent, "}\n");
4105                 break;
4106
4107 ###### propagate binode cases
4108         case Program: abort();          // NOTEST
4109
4110 ###### core functions
4111
4112         static int analyse_prog(struct exec *prog, struct parse_context *c)
4113         {
4114                 struct binode *b = cast(binode, prog);
4115                 int ok = 1;
4116
4117                 if (!b)
4118                         return 0;       // NOTEST
4119                 do {
4120                         ok = 1;
4121                         propagate_types(b->right, c, &ok, Tnone, 0);
4122                 } while (ok == 2);
4123                 if (!ok)
4124                         return 0;
4125
4126                 for (b = cast(binode, b->left); b; b = cast(binode, b->right)) {
4127                         struct var *v = cast(var, b->left);
4128                         if (!v->var->val.type) {
4129                                 v->var->where_set = b;
4130                                 v->var->val = val_prepare(Tstr);
4131                         }
4132                 }
4133                 b = cast(binode, prog);
4134                 do {
4135                         ok = 1;
4136                         propagate_types(b->right, c, &ok, Tnone, 0);
4137                 } while (ok == 2);
4138                 if (!ok)
4139                         return 0;
4140
4141                 /* Make sure everything is still consistent */
4142                 propagate_types(b->right, c, &ok, Tnone, 0);
4143                 return !!ok;
4144         }
4145
4146         static void interp_prog(struct exec *prog, char **argv)
4147         {
4148                 struct binode *p = cast(binode, prog);
4149                 struct binode *al;
4150                 struct value v;
4151
4152                 if (!prog)
4153                         return;         // NOTEST
4154                 al = cast(binode, p->left);
4155                 while (al) {
4156                         struct var *v = cast(var, al->left);
4157                         struct value *vl = &v->var->val;
4158
4159                         if (argv[0] == NULL) {
4160                                 printf("Not enough args\n");
4161                                 exit(1);
4162                         }
4163                         al = cast(binode, al->right);
4164                         free_value(*vl);
4165                         *vl = parse_value(vl->type, argv[0]);
4166                         if (vl->type == NULL)
4167                                 exit(1);
4168                         argv++;
4169                 }
4170                 v = interp_exec(p->right);
4171                 free_value(v);
4172         }
4173
4174 ###### interp binode cases
4175         case Program: abort();  // NOTEST
4176
4177 ## And now to test it out.
4178
4179 Having a language requires having a "hello world" program.  I'll
4180 provide a little more than that: a program that prints "Hello world"
4181 finds the GCD of two numbers, prints the first few elements of
4182 Fibonacci, performs a binary search for a number, and a few other
4183 things which will likely grow as the languages grows.
4184
4185 ###### File: oceani.mk
4186         tests :: sayhello
4187         sayhello : oceani
4188                 @echo "===== TEST ====="
4189                 ./oceani --section "test: hello" oceani.mdc 55 33
4190
4191 ###### test: hello
4192
4193         const:
4194                 pi ::= 3.1415926
4195                 four ::= 2 + 2 ; five ::= 10/2
4196         const pie ::= "I like Pie";
4197                 cake ::= "The cake is"
4198                   ++ " a lie"
4199
4200         struct fred:
4201                 size:[four]number
4202                 name:string
4203                 alive:Boolean
4204
4205         program A B:
4206                 print "Hello World, what lovely oceans you have!"
4207                 print "Are there", five, "?"
4208                 print pi, pie, "but", cake
4209
4210                 /* When a variable is defined in both branches of an 'if',
4211                  * and used afterwards, the variables are merged.
4212                  */
4213                 if A > B:
4214                         bigger := "yes"
4215                 else:
4216                         bigger := "no"
4217                 print "Is", A, "bigger than", B,"? ", bigger
4218                 /* If a variable is not used after the 'if', no
4219                  * merge happens, so types can be different
4220                  */
4221                 if A > B * 2:
4222                         double:string = "yes"
4223                         print A, "is more than twice", B, "?", double
4224                 else:
4225                         double := B*2
4226                         print "double", B, "is", double
4227
4228                 a : number
4229                 a = A;
4230                 b:number = B
4231                 if a > 0 and then b > 0:
4232                         while a != b:
4233                                 if a < b:
4234                                         b = b - a
4235                                 else:
4236                                         a = a - b
4237                         print "GCD of", A, "and", B,"is", a
4238                 else if a <= 0:
4239                         print a, "is not positive, cannot calculate GCD"
4240                 else:
4241                         print b, "is not positive, cannot calculate GCD"
4242
4243                 for:
4244                         togo := 10
4245                         f1 := 1; f2 := 1
4246                         print "Fibonacci:", f1,f2,
4247                 then togo = togo - 1
4248                 while togo > 0:
4249                         f3 := f1 + f2
4250                         print "", f3,
4251                         f1 = f2
4252                         f2 = f3
4253                 print ""
4254
4255                 /* Binary search... */
4256                 for:
4257                         lo:= 0; hi := 100
4258                         target := 77
4259                 while:
4260                         mid := (lo + hi) / 2
4261                         if mid == target:
4262                                 use Found
4263                         if mid < target:
4264                                 lo = mid
4265                         else:
4266                                 hi = mid
4267                         if hi - lo < 1:
4268                                 use GiveUp
4269                         use True
4270                 do: pass
4271                 case Found:
4272                         print "Yay, I found", target
4273                 case GiveUp:
4274                         print "Closest I found was", mid
4275
4276                 size::= 10
4277                 list:[size]number
4278                 list[0] = 1234
4279                 // "middle square" PRNG.  Not particularly good, but one my
4280                 // Dad taught me - the first one I ever heard of.
4281                 for i:=1; then i = i + 1; while i < size:
4282                         n := list[i-1] * list[i-1]
4283                         list[i] = (n / 100) % 10000
4284
4285                 print "Before sort:",
4286                 for i:=0; then i = i + 1; while i < size:
4287                         print "", list[i],
4288                 print
4289
4290                 for i := 1; then i=i+1; while i < size:
4291                         for j:=i-1; then j=j-1; while j >= 0:
4292                                 if list[j] > list[j+1]:
4293                                         t:= list[j]
4294                                         list[j] = list[j+1]
4295                                         list[j+1] = t
4296                 print " After sort:",
4297                 for i:=0; then i = i + 1; while i < size:
4298                         print "", list[i],
4299                 print
4300
4301                 bob:fred
4302                 bob.name = "Hello"
4303                 bob.alive = (bob.name == "Hello")
4304                 print "bob", "is" if  bob.alive else "isn't", "alive"