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