]> ocean-lang.org Git - ocean/blob - csrc/parsergen.mdc
oceani/parsergen: assorted text improvements.
[ocean] / csrc / parsergen.mdc
1 # LR(1) Parser Generator #
2
3 This parser generator takes a grammar description combined with code
4 fragments, analyses it, and can report details about the analysis and
5 write out C code files which can be compiled to make a parser.
6
7 There are several distinct sections.
8
9 1. `grammar_read` will read a grammar from a literate-code file and
10    store the productions, symbols, and code fragments.
11 2. `grammar_analyse` will take that grammar and build LR parsing
12    states and look-ahead tables.
13 3. `grammar_report` will present the details of the analysis
14    in a readable format and will report any conflicts.
15 4. `parser_generate` will write out C code files with various
16    tables and with the code fragments arranged in useful places.
17 5. `parser_run` is a library function intended to be linked together
18    with the generated parser tables to complete the implementation of
19    a parser.
20 6. Finally `calc` is a test grammar for a simple calculator.  The
21    `parsergen` program built from the C code in this file can extract
22    that grammar directly from this file and process it.
23
24
25 ###### File: parsergen.c
26         #include <unistd.h>
27         #include <stdlib.h>
28         #include <stdio.h>
29         ## includes
30         ## forward declarations
31         ## declarations
32         ## functions
33         ## grammar_read
34         ## grammar_analyse
35         ## grammar_report
36         ## parser_generate
37         ## main
38 ###### File: parser.h
39         ## exported types
40         ## exported functions
41 ###### File: libparser.c
42         #include <unistd.h>
43         #include <stdlib.h>
44         #include <stdio.h>
45         ## parser includes
46         ## parser functions
47         ## parser_run
48 ###### File: parsergen.mk
49         CFLAGS += -Wall -g
50         all :: parsergen calc
51         parsergen.c parsergen.mk libparser.c parser.h : parsergen.mdc
52                 ./md2c parsergen.mdc
53
54 ## Reading the grammar
55
56 The grammar must be stored in a markdown literate code file as parsed
57 by "[mdcode][]".  It must have three top level (i.e. unreferenced)
58 sections: `header`, `code`, and `grammar`.  The first two will be
59 literally copied into the generated `.c` and `.h`. files.  The last
60 contains the grammar.  This is tokenised with "[scanner][]".
61
62 If the `--tag` option is given, then any top level header that doesn't
63 start with the tag is ignored, and the tag is striped from the rest.  So
64 `--tag Foo`
65 means that the three needed sections must be `Foo: header`, `Foo: code`,
66 and `Foo: grammar`.  The tag `calc` is used to extract the same calculator
67 from this file.
68
69 [mdcode]: mdcode.html
70 [scanner]: scanner.html
71
72 ###### includes
73         #include "mdcode.h"
74         #include "scanner.h"
75
76 ###### parser includes
77         #include "mdcode.h"
78         #include "scanner.h"
79
80 The grammar contains production sets, precedence/associativity
81 declarations, and data type declarations.  These are all parsed with
82 _ad hoc_ parsing as we don't have a parser generator yet.
83
84 The precedence and associativity can be set for each production, but
85 can be inherited from symbols.  The data type (either structure or a
86 reference to a structure) is potentially defined for each non-terminal
87 and describes what C structure is used to store information about each
88 symbol.
89
90 ###### declarations
91         enum assoc {Left, Right, Non};
92         char *assoc_names[] = {"Left","Right","Non"};
93
94         struct symbol {
95                 struct text struct_name;
96                 int isref;
97                 enum assoc assoc;
98                 unsigned short precedence;
99                 ## symbol fields
100         };
101         struct production {
102                 unsigned short precedence;
103                 enum assoc assoc;
104                 ## production fields
105         };
106         struct grammar {
107                 ## grammar fields
108         };
109
110 The strings reported by `mdcode` and `scanner` are `struct text` which have
111 length rather than being null terminated.  To help with printing and
112 comparing we define `text_is` and `prtxt`, which should possibly go in
113 `mdcode`.  `scanner` does provide `text_dump` which is useful for strings
114 which might contain control characters.
115
116 `strip_tag` is a bit like `strncmp`, but adds a test for a colon,
117 because that is what we need to detect tags.
118
119 ###### functions
120         static int text_is(struct text t, char *s)
121         {
122                 return (strlen(s) == t.len &&
123                         strncmp(s, t.txt, t.len) == 0);
124         }
125         static void prtxt(struct text t)
126         {
127                 printf("%.*s", t.len, t.txt);
128         }
129
130         static int strip_tag(struct text *t, char *tag)
131         {
132                 int skip = strlen(tag) + 1;
133                 if (skip >= t->len ||
134                     strncmp(t->txt, tag, skip-1) != 0 ||
135                     t->txt[skip-1] != ':')
136                         return 0;
137                 while (skip < t->len && t->txt[skip] == ' ')
138                         skip++;
139                 t->len -= skip;
140                 t->txt += skip;
141                 return 1;
142         }
143
144 ### Symbols
145
146 Productions are comprised primarily of symbols - terminal and
147 non-terminal.  We do not make a syntactic distinction between the two,
148 though non-terminals must be identifiers.  Non-terminal symbols are
149 those which appear in the head of a production, terminal symbols are
150 those which don't.  There are also "virtual" symbols used for precedence
151 marking discussed later, and sometimes we won't know what type a symbol
152 is yet.
153
154 ###### forward declarations
155         enum symtype { Unknown, Virtual, Terminal, Nonterminal };
156         char *symtypes = "UVTN";
157 ###### symbol fields
158         enum symtype type;
159
160 Symbols can be either `TK_ident` or `TK_mark`.  They are saved in a
161 table of known symbols and the resulting parser will report them as
162 `TK_reserved + N`.  A small set of identifiers are reserved for the
163 different token types that `scanner` can report.
164
165 ###### declarations
166         static char *reserved_words[] = {
167                 [TK_error]        = "ERROR",
168                 [TK_number]       = "NUMBER",
169                 [TK_ident]        = "IDENTIFIER",
170                 [TK_mark]         = "MARK",
171                 [TK_string]       = "STRING",
172                 [TK_multi_string] = "MULTI_STRING",
173                 [TK_in]           = "IN",
174                 [TK_out]          = "OUT",
175                 [TK_newline]      = "NEWLINE",
176                 [TK_eof]          = "$eof",
177         };
178 ###### symbol fields
179         short num;
180
181 Note that `TK_eof` and the two `TK_*_comment` tokens cannot be
182 recognised.  The former is automatically expected at the end of the text
183 being parsed. The latter are always ignored by the parser.
184
185 All of these symbols are stored in a simple symbol table.  We use the
186 `struct text` from `mdcode` to store the name and link them together
187 into a sorted list using an insertion sort.
188
189 We don't have separate `find` and `insert` functions as any symbol we
190 find needs to be remembered.  We simply expect `find` to always return a
191 symbol, but its type might be `Unknown`.
192
193 ###### includes
194         #include <string.h>
195
196 ###### symbol fields
197         struct text name;
198         struct symbol *next;
199
200 ###### grammar fields
201         struct symbol *syms;
202         int num_syms;
203
204 ###### functions
205         static struct symbol *sym_find(struct grammar *g, struct text s)
206         {
207                 struct symbol **l = &g->syms;
208                 struct symbol *n;
209                 int cmp = 1;
210
211                 while (*l &&
212                         (cmp = text_cmp((*l)->name, s)) < 0)
213                                 l = & (*l)->next;
214                 if (cmp == 0)
215                         return *l;
216                 n = calloc(1, sizeof(*n));
217                 n->name = s;
218                 n->type = Unknown;
219                 n->next = *l;
220                 n->num = -1;
221                 *l = n;
222                 return n;
223         }
224
225         static void symbols_init(struct grammar *g)
226         {
227                 int entries = sizeof(reserved_words)/sizeof(reserved_words[0]);
228                 int i;
229                 for (i = 0; i < entries; i++) {
230                         struct text t;
231                         struct symbol *s;
232                         t.txt = reserved_words[i];
233                         if (!t.txt)
234                                 continue;
235                         t.len = strlen(t.txt);
236                         s = sym_find(g, t);
237                         s->type = Terminal;
238                         s->num = i;
239                 }
240         }
241
242 ### Data types and precedence.
243
244 Data type specification and precedence specification are both
245 introduced by a dollar sign at the start of the line.  If the next
246 word is `LEFT`, `RIGHT` or `NON`, then the line specifies a
247 precedence, otherwise it specifies a data type.
248
249 The data type name is simply stored and applied to the head of all
250 subsequent productions.  It must be the name of a structure optionally
251 preceded by an asterisk which means a reference or "pointer".  So
252 `$expression` maps to `struct expression` and `$*statement` maps to
253 `struct statement *`.
254
255 Any productions given before the first data type declaration will have
256 no data type associated with them and can carry no information.  In
257 order to allow other non-terminals to have no type, the data type
258 `$void` can be given.  This does *not* mean that `struct void` will be
259 used, but rather than no type will be associated with future
260 non-terminals.
261
262 The precedence line must contain a list of symbols - typically
263 terminal symbols, but not necessarily.  It can only contain symbols
264 that have not been seen yet, so precedence declaration must precede
265 the productions that they affect.
266
267 A precedence line may also contain a "virtual" symbol which is an
268 identifier preceded by `$$`.  Virtual terminals carry precedence
269 information but are not included in the grammar.  A production can
270 declare that it inherits the precedence of a given virtual symbol.
271
272 This use for `$$` precludes it from being used as a symbol in the
273 described language.  Two other symbols: `${` and `}$` are also
274 unavailable.
275
276 Each new precedence line introduces a new precedence level and
277 declares how it associates.  This level is stored in each symbol
278 listed and may be inherited by any production which uses the symbol.  A
279 production inherits from the last symbol which has a precedence.
280
281 ###### grammar fields
282         struct text current_type;
283         int type_isref;
284         int prec_levels;
285
286 ###### declarations
287         enum symbols { TK_virtual = TK_reserved, TK_open, TK_close };
288         static const char *known[] = { "$$", "${", "}$" };
289
290 ###### functions
291         static char *dollar_line(struct token_state *ts, struct grammar *g, int isref)
292         {
293                 struct token t = token_next(ts);
294                 char *err;
295                 enum assoc assoc;
296                 int found;
297
298                 if (t.num != TK_ident) {
299                         err = "type or assoc expected after '$'";
300                         goto abort;
301                 }
302                 if (text_is(t.txt, "LEFT"))
303                         assoc = Left;
304                 else if (text_is(t.txt, "RIGHT"))
305                         assoc = Right;
306                 else if (text_is(t.txt, "NON"))
307                         assoc = Non;
308                 else {
309                         g->current_type = t.txt;
310                         g->type_isref = isref;
311                         if (text_is(t.txt, "void"))
312                                 g->current_type.txt = NULL;
313                         t = token_next(ts);
314                         if (t.num != TK_newline) {
315                                 err = "Extra tokens after type name";
316                                 goto abort;
317                         }
318                         return NULL;
319                 }
320
321                 if (isref) {
322                         err = "$* cannot be followed by a precedence";
323                         goto abort;
324                 }
325
326                 // This is a precedence line, need some symbols.
327                 found = 0;
328                 g->prec_levels += 1;
329                 t = token_next(ts);
330                 while (t.num != TK_newline) {
331                         enum symtype type = Terminal;
332                         struct symbol *s;
333                         if (t.num == TK_virtual) {
334                                 type = Virtual;
335                                 t = token_next(ts);
336                                 if (t.num != TK_ident) {
337                                         err = "$$ must be followed by a word";
338                                         goto abort;
339                                 }
340                         } else if (t.num != TK_ident &&
341                                    t.num != TK_mark) {
342                                 err = "Illegal token in precedence line";
343                                 goto abort;
344                         }
345                         s = sym_find(g, t.txt);
346                         if (s->type != Unknown) {
347                                 err = "Symbols in precedence line must not already be known.";
348                                 goto abort;
349                         }
350                         s->type = type;
351                         s->precedence = g->prec_levels;
352                         s->assoc = assoc;
353                         found += 1;
354                 }
355                 if (found == 0)
356                         err = "No symbols given on precedence line";
357                         goto abort;
358                 return NULL;
359         abort:
360                 while (t.num != TK_newline && t.num != TK_eof)
361                         t = token_next(ts);
362                 return err;
363         }
364
365 ### Productions
366
367 A production either starts with an identifier which is the head
368 non-terminal, or a vertical bar (`|`) in which case this production
369 uses the same head as the previous one.  The identifier must be
370 followed by a `->` mark.  All productions for a given non-terminal must
371 be grouped together with the `nonterminal ->` given only once.
372
373 After this a (possibly empty) sequence of identifiers and marks form
374 the body of the production.  A virtual symbol may be given after the
375 body by preceding it with `$$`.  If a virtual symbol is given, the
376 precedence of the production is that for the virtual symbol.  If none
377 is given, the precedence is inherited from the last symbol in the
378 production which has a precedence specified.
379
380 After the optional precedence may come the `${` mark.  This indicates
381 the start of a code fragment.  If present, this must be on the same
382 line as the start of the production.
383
384 All of the text from the `${` through to the matching `}$` is
385 collected and forms the code-fragment for the production.  It must all
386 be in one `code_node` of the literate code.  The `}$` must be
387 at the end of a line.
388
389 Text in the code fragment will undergo substitutions where `$N` or
390 `$<N`,for some numeric `N`, will be replaced with a variable holding
391 the parse information for the particular symbol in the production.
392 `$0` is the head of the production, `$1` is the first symbol of the
393 body, etc.  The type of `$N` for a terminal symbol is `struct token`.
394 For a non-terminal, it is whatever has been declared for that symbol.
395 The `<` may be included for symbols declared as storing a reference
396 (not a structure) and means that the reference is being moved out, so
397 it will not automatically be freed.
398
399 While building productions we will need to add to an array which needs to
400 grow dynamically.
401
402 ###### functions
403         static void array_add(void *varray, int *cnt, void *new)
404         {
405                 void ***array = varray;
406                 int current = 0;
407                 const int step = 8;
408                 current = ((*cnt-1) | (step-1))+1;
409                 if (*cnt == current) {
410                         /* must grow */
411                         current += step;
412                         *array = realloc(*array, current * sizeof(void*));
413                 }
414                 (*array)[*cnt] = new;
415                 (*cnt) += 1;
416         }
417
418 Collecting the code fragment simply involves reading tokens until we
419 hit the end token `}$`, and noting the character position of the start and
420 the end.
421
422 ###### functions
423         static struct text collect_code(struct token_state *state,
424                                         struct token start)
425         {
426                 struct text code;
427                 struct token t;
428                 code.txt = start.txt.txt + start.txt.len;
429                 do
430                         t = token_next(state);
431                 while (t.node == start.node &&
432                        t.num != TK_close && t.num != TK_error &&
433                        t.num != TK_eof);
434                 if (t.num == TK_close && t.node == start.node)
435                         code.len = t.txt.txt - code.txt;
436                 else
437                         code.txt = NULL;
438                 return code;
439         }
440
441 Now we have all the bits we need to parse a full production.
442
443 ###### includes
444         #include <memory.h>
445
446 ###### grammar fields
447         struct production **productions;
448         int production_count;
449
450 ###### production fields
451         struct symbol  *head;
452         struct symbol **body;
453         int             body_size;
454         struct text     code;
455
456 ###### symbol fields
457         int first_production;
458
459 ###### functions
460         static char *parse_production(struct grammar *g,
461                                       struct symbol *head,
462                                       struct token_state *state)
463         {
464                 /* Head has already been parsed. */
465                 struct token tk;
466                 char *err;
467                 struct production p, *pp;
468
469                 memset(&p, 0, sizeof(p));
470                 p.head = head;
471                 tk = token_next(state);
472                 while (tk.num == TK_ident || tk.num == TK_mark) {
473                         struct symbol *bs = sym_find(g, tk.txt);
474                         if (bs->type == Unknown)
475                                 bs->type = Terminal;
476                         if (bs->type == Virtual) {
477                                 err = "Virtual symbol not permitted in production";
478                                 goto abort;
479                         }
480                         if (bs->precedence) {
481                                 p.precedence = bs->precedence;
482                                 p.assoc = bs->assoc;
483                         }
484                         array_add(&p.body, &p.body_size, bs);
485                         tk = token_next(state);
486                 }
487                 if (tk.num == TK_virtual) {
488                         struct symbol *vs;
489                         tk = token_next(state);
490                         if (tk.num != TK_ident) {
491                                 err = "word required after $$";
492                                 goto abort;
493                         }
494                         vs = sym_find(g, tk.txt);
495                         if (vs->type != Virtual) {
496                                 err = "symbol after $$ must be virtual";
497                                 goto abort;
498                         }
499                         p.precedence = vs->precedence;
500                         p.assoc = vs->assoc;
501                         tk = token_next(state);
502                 }
503                 if (tk.num == TK_open) {
504                         p.code = collect_code(state, tk);
505                         if (p.code.txt == NULL) {
506                                 err = "code fragment not closed properly";
507                                 goto abort;
508                         }
509                         tk = token_next(state);
510                 }
511                 if (tk.num != TK_newline && tk.num != TK_eof) {
512                         err = "stray tokens at end of line";
513                         goto abort;
514                 }
515                 pp = malloc(sizeof(*pp));
516                 *pp = p;
517                 array_add(&g->productions, &g->production_count, pp);
518                 return NULL;
519         abort:
520                 while (tk.num != TK_newline && tk.num != TK_eof)
521                         tk = token_next(state);
522                 return err;
523         }
524
525 With the ability to parse production and dollar-lines, we have nearly all
526 that we need to parse a grammar from a `code_node`.
527
528 The head of the first production will effectively be the `start` symbol of
529 the grammar.  However it won't _actually_ be so.  Processing the grammar is
530 greatly simplified if the real start symbol only has a single production,
531 and expects `$eof` as the final terminal.  So when we find the first
532 explicit production we insert an extra production as production zero which
533 looks like
534
535 ###### Example: production 0
536         $start -> START $eof
537
538 where `START` is the first non-terminal given.
539
540 ###### create production zero
541         struct production *p = calloc(1,sizeof(*p));
542         struct text start = {"$start",6};
543         struct text eof = {"$eof",4};
544         struct text code = {"$0 = $<1;", 9};
545         p->head = sym_find(g, start);
546         p->head->type = Nonterminal;
547         p->head->struct_name = g->current_type;
548         p->head->isref = g->type_isref;
549         if (g->current_type.txt)
550                 p->code = code;
551         array_add(&p->body, &p->body_size, head);
552         array_add(&p->body, &p->body_size, sym_find(g, eof));
553         p->head->first_production = g->production_count;
554         array_add(&g->productions, &g->production_count, p);
555
556 Now we are ready to read in the grammar.  We ignore comments
557 and strings so that the marks which introduce them can be
558 used as terminals in the grammar.  We don't ignore numbers
559 even though we don't allow them as that causes the scanner
560 to produce errors that the parser is better positioned to handle.
561
562 ###### grammar_read
563         static struct grammar *grammar_read(struct code_node *code)
564         {
565                 struct token_config conf = {
566                         .word_start = "",
567                         .word_cont = "",
568                         .words_marks = known,
569                         .known_count = sizeof(known)/sizeof(known[0]),
570                         .number_chars = "",
571                         .ignored = (1 << TK_line_comment)
572                                  | (1 << TK_block_comment)
573                                  | (0 << TK_number)
574                                  | (1 << TK_string)
575                                  | (1 << TK_multi_string)
576                                  | (1 << TK_in)
577                                  | (1 << TK_out),
578                 };
579
580                 struct token_state *state = token_open(code, &conf);
581                 struct token tk;
582                 struct symbol *head = NULL;
583                 struct grammar *g;
584                 char *err = NULL;
585
586                 g = calloc(1, sizeof(*g));
587                 symbols_init(g);
588
589                 for (tk = token_next(state); tk.num != TK_eof;
590                      tk = token_next(state)) {
591                         if (tk.num == TK_newline)
592                                 continue;
593                         if (tk.num == TK_ident) {
594                                 // new non-terminal
595                                 head = sym_find(g, tk.txt);
596                                 if (head->type == Nonterminal)
597                                         err = "This non-terminal has already be used.";
598                                 else if (head->type == Virtual)
599                                         err = "Virtual symbol not permitted in head of production";
600                                 else {
601                                         head->type = Nonterminal;
602                                         head->struct_name = g->current_type;
603                                         head->isref = g->type_isref;
604                                         if (g->production_count == 0) {
605                                                 ## create production zero
606                                         }
607                                         head->first_production = g->production_count;
608                                         tk = token_next(state);
609                                         if (tk.num == TK_mark &&
610                                             text_is(tk.txt, "->"))
611                                                 err = parse_production(g, head, state);
612                                         else
613                                                 err = "'->' missing in production";
614                                 }
615                         } else if (tk.num == TK_mark
616                                    && text_is(tk.txt, "|")) {
617                                 // another production for same non-term
618                                 if (head)
619                                         err = parse_production(g, head, state);
620                                 else
621                                         err = "First production must have a head";
622                         } else if (tk.num == TK_mark
623                                    && text_is(tk.txt, "$")) {
624                                 err = dollar_line(state, g, 0);
625                         } else if (tk.num == TK_mark
626                                    && text_is(tk.txt, "$*")) {
627                                 err = dollar_line(state, g, 1);
628                         } else {
629                                 err = "Unrecognised token at start of line.";
630                         }
631                         if (err)
632                                 goto abort;
633                 }
634                 token_close(state);
635                 return g;
636         abort:
637                 fprintf(stderr, "Error at line %d: %s\n",
638                         tk.line, err);
639                 token_close(state);
640                 free(g);
641                 return NULL;
642         }
643
644 ## Analysing the grammar
645
646 The central task in analysing the grammar is to determine a set of
647 states to drive the parsing process.  This will require finding
648 various sets of symbols and of "items".  Some of these sets will need
649 to attach information to each element in the set, so they are more
650 like maps.
651
652 Each "item" may have a 'look-ahead' or `LA` set associated with
653 it.  Many of these will be the same as each other.  To avoid memory
654 wastage, and to simplify some comparisons of sets, these sets will be
655 stored in a list of unique sets, each assigned a number.
656
657 Once we have the data structures in hand to manage these sets and
658 lists, we can start setting the 'nullable' flag, build the 'FIRST'
659 sets, and then create the item sets which define the various states.
660
661 ### Symbol sets.
662
663 Though we don't only store symbols in these sets, they are the main
664 things we store, so they are called symbol sets or "symsets".
665
666 A symset has a size, an array of shorts, and an optional array of data
667 values, which are also shorts.  If the array of data is not present,
668 we store an impossible pointer, as `NULL` is used to indicate that no
669 memory has been allocated yet;
670
671 ###### declarations
672         struct symset {
673                 short cnt;
674                 unsigned short *syms, *data;
675         };
676         #define NO_DATA ((unsigned short *)1)
677         const struct symset INIT_SYMSET =  { 0, NULL, NO_DATA };
678         const struct symset INIT_DATASET = { 0, NULL, NULL };
679
680 The arrays of shorts are allocated in blocks of 8 and are kept sorted
681 by using an insertion sort.  We don't explicitly record the amount of
682 allocated space as it can be derived directly from the current `cnt` using
683 `((cnt - 1) | 7) + 1`.
684
685 ###### functions
686         static void symset_add(struct symset *s, unsigned short key, unsigned short val)
687         {
688                 int i;
689                 int current = ((s->cnt-1) | 7) + 1;
690                 if (current == s->cnt) {
691                         current += 8;
692                         s->syms = realloc(s->syms, sizeof(*s->syms) * current);
693                         if (s->data != NO_DATA)
694                                 s->data = realloc(s->data, sizeof(*s->data) * current);
695                 }
696                 i = s->cnt;
697                 while (i > 0 && s->syms[i-1] > key) {
698                         s->syms[i] = s->syms[i-1];
699                         if (s->data != NO_DATA)
700                                 s->data[i] = s->data[i-1];
701                         i--;
702                 }
703                 s->syms[i] = key;
704                 if (s->data != NO_DATA)
705                         s->data[i] = val;
706                 s->cnt += 1;
707         }
708
709 Finding a symbol (or item) in a `symset` uses a simple binary search.
710 We return the index where the value was found (so data can be accessed),
711 or `-1` to indicate failure.
712
713         static int symset_find(struct symset *ss, unsigned short key)
714         {
715                 int lo = 0;
716                 int hi = ss->cnt;
717
718                 if (hi == 0)
719                         return -1;
720                 while (lo + 1 < hi) {
721                         int mid = (lo + hi) / 2;
722                         if (ss->syms[mid] <= key)
723                                 lo = mid;
724                         else
725                                 hi = mid;
726                 }
727                 if (ss->syms[lo] == key)
728                         return lo;
729                 return -1;
730         }
731
732 We will often want to form the union of two symsets.  When we do, we
733 will often want to know if anything changed (as that might mean there
734 is more work to do).  So `symset_union` reports whether anything was
735 added to the first set.  We use a slow quadratic approach as these
736 sets don't really get very big.  If profiles shows this to be a problem it
737 can be optimised later.
738
739         static int symset_union(struct symset *a, struct symset *b)
740         {
741                 int i;
742                 int added = 0;
743                 for (i = 0; i < b->cnt; i++)
744                         if (symset_find(a, b->syms[i]) < 0) {
745                                 unsigned short data = 0;
746                                 if (b->data != NO_DATA)
747                                         data = b->data[i];
748                                 symset_add(a, b->syms[i], data);
749                                 added++;
750                         }
751                 return added;
752         }
753
754 And of course we must be able to free a symset.
755
756         static void symset_free(struct symset ss)
757         {
758                 free(ss.syms);
759                 if (ss.data != NO_DATA)
760                         free(ss.data);
761         }
762
763 ### Symset Storage
764
765 Some symsets are simply stored somewhere appropriate in the `grammar`
766 data structure, others needs a bit of indirection.  This applies
767 particularly to "LA" sets.  These will be paired with "items" in an
768 "itemset".  As itemsets will be stored in a symset, the "LA" set needs to be
769 stored in the `data` field, so we need a mapping from a small (short)
770 number to an LA `symset`.
771
772 As mentioned earlier this involves creating a list of unique symsets.
773
774 For now, we just use a linear list sorted by insertion.  A skiplist
775 would be more efficient and may be added later.
776
777 ###### declarations
778
779         struct setlist {
780                 struct symset ss;
781                 int num;
782                 struct setlist *next;
783         };
784
785 ###### grammar fields
786         struct setlist *sets;
787         int nextset;
788
789 ###### functions
790
791         static int ss_cmp(struct symset a, struct symset b)
792         {
793                 int i;
794                 int diff = a.cnt - b.cnt;
795                 if (diff)
796                         return diff;
797                 for (i = 0; i < a.cnt; i++) {
798                         diff = (int)a.syms[i] - (int)b.syms[i];
799                         if (diff)
800                                 return diff;
801                 }
802                 return 0;
803         }
804
805         static int save_set(struct grammar *g, struct symset ss)
806         {
807                 struct setlist **sl = &g->sets;
808                 int cmp = 1;
809                 struct setlist *s;
810
811                 while (*sl && (cmp = ss_cmp((*sl)->ss, ss)) < 0)
812                         sl = & (*sl)->next;
813                 if (cmp == 0) {
814                         symset_free(ss);
815                         return (*sl)->num;
816                 }
817
818                 s = malloc(sizeof(*s));
819                 s->ss = ss;
820                 s->num = g->nextset;
821                 g->nextset += 1;
822                 s->next = *sl;
823                 *sl = s;
824                 return s->num;
825         }
826
827 Finding a set by number is currently performed by a simple linear search.
828 If this turns out to hurt performance, we can store the sets in a dynamic
829 array like the productions.
830
831         static struct symset set_find(struct grammar *g, int num)
832         {
833                 struct setlist *sl = g->sets;
834                 while (sl && sl->num != num)
835                         sl = sl->next;
836                 return sl->ss;
837         }
838
839
840 ### Setting `nullable`
841
842 We set `nullable` on the head symbol for any production for which all
843 the body symbols (if any) are nullable.  As this is a recursive
844 definition, any change in the `nullable` setting means that we need to
845 re-evaluate where it needs to be set.
846
847 We simply loop around performing the same calculations until no more
848 changes happen.
849
850 ###### symbol fields
851         int nullable;
852
853 ###### functions
854         static void set_nullable(struct grammar *g)
855         {
856                 int check_again = 1;
857                 while (check_again) {
858                         int p;
859                         check_again = 0;
860                         for (p = 0; p < g->production_count; p++) {
861                                 struct production *pr = g->productions[p];
862                                 int s;
863
864                                 if (pr->head->nullable)
865                                         continue;
866                                 for (s = 0; s < pr->body_size; s++)
867                                         if (! pr->body[s]->nullable)
868                                                 break;
869                                 if (s == pr->body_size) {
870                                         pr->head->nullable = 1;
871                                         check_again = 1;
872                                 }
873                         }
874                 }
875         }
876
877 ### Setting `can_eol` and `line_like`
878
879 In order to be able to ignore newline tokens when not relevant, but
880 still include them in the parse when needed, we will need to know
881 which states can start a "line-like" section of code.  We ignore
882 newlines when there is an indent since the most recent start of a
883 line-like symbol.
884
885 To know which symbols are line-like, we first need to know which
886 symbols start with a NEWLINE token.  Any symbol which is followed by a
887 NEWLINE, or anything that starts with a NEWLINE, is deemed to be a line-like symbol.
888 Certainly when trying to parse one of these we must take note of NEWLINEs.
889
890 Clearly the `TK_newline` token can start with a NEWLINE.  Any symbol
891 which is the head of a production that contains a starts-with-NEWLINE
892 symbol preceeded only by nullable symbols is also a
893 starts-with-NEWLINE symbol.  We use a new field `can_eol` to record
894 this attribute of symbols, and compute it in a repetitive manner
895 similar to `set_nullable`.
896
897 Once we have that, we can determine which symbols are `line_like` by
898 seeing which are followed by a `can_eol` symbol in any production.
899
900 ###### symbol fields
901         int can_eol;
902         int line_like;
903
904 ###### functions
905         static void set_can_eol(struct grammar *g)
906         {
907                 int check_again = 1;
908                 g->symtab[TK_newline]->can_eol = 1;
909                 while (check_again) {
910                         int p;
911                         check_again = 0;
912                         for (p = 0; p < g->production_count; p++) {
913                                 struct production *pr = g->productions[p];
914                                 int s;
915
916                                 if (pr->head->can_eol)
917                                         continue;
918
919                                 for (s = 0 ; s < pr->body_size; s++) {
920                                         if (pr->body[s]->can_eol) {
921                                                 pr->head->can_eol = 1;
922                                                 check_again = 1;
923                                                 break;
924                                         }
925                                         if (!pr->body[s]->nullable)
926                                                 break;
927                                 }
928                         }
929                 }
930         }
931
932         static void set_line_like(struct grammar *g)
933         {
934                 int p;
935                 for (p = 0; p < g->production_count; p++) {
936                         struct production *pr = g->productions[p];
937                         int s;
938
939                         for (s = 1; s < pr->body_size; s++)
940                                 if (pr->body[s]->can_eol)
941                                         pr->body[s-1]->line_like = 1;
942                 }
943         }
944
945 ### Building the `first` sets
946
947 When calculating what can follow a particular non-terminal, we will need to
948 know what the "first" terminal in any subsequent non-terminal might be.  So
949 we calculate the `first` set for every non-terminal and store them in an
950 array.  We don't bother recording the "first" set for terminals as they are
951 trivial.
952
953 As the "first" for one symbol might depend on the "first" of another,
954 we repeat the calculations until no changes happen, just like with
955 `set_nullable`.  This makes use of the fact that `symset_union`
956 reports if any change happens.
957
958 The core of this, which finds the "first" of part of a production body,
959 will be reused for computing the "follow" sets, so we split it out
960 into a separate function.
961
962 ###### grammar fields
963         struct symset *first;
964
965 ###### functions
966
967         static int add_first(struct production *pr, int start,
968                              struct symset *target, struct grammar *g,
969                              int *to_end)
970         {
971                 int s;
972                 int changed = 0;
973                 for (s = start; s < pr->body_size; s++) {
974                         struct symbol *bs = pr->body[s];
975                         if (bs->type == Terminal) {
976                                 if (symset_find(target, bs->num) < 0) {
977                                         symset_add(target, bs->num, 0);
978                                         changed = 1;
979                                 }
980                                 break;
981                         } else if (symset_union(target, &g->first[bs->num]))
982                                 changed = 1;
983                         if (!bs->nullable)
984                                 break;
985                 }
986                 if (to_end)
987                         *to_end = (s == pr->body_size);
988                 return changed;
989         }
990
991         static void build_first(struct grammar *g)
992         {
993                 int check_again = 1;
994                 int s;
995                 g->first = calloc(g->num_syms, sizeof(g->first[0]));
996                 for (s = 0; s < g->num_syms; s++)
997                         g->first[s] = INIT_SYMSET;
998
999                 while (check_again) {
1000                         int p;
1001                         check_again = 0;
1002                         for (p = 0; p < g->production_count; p++) {
1003                                 struct production *pr = g->productions[p];
1004                                 struct symset *head = &g->first[pr->head->num];
1005
1006                                 if (add_first(pr, 0, head, g, NULL))
1007                                         check_again = 1;
1008                         }
1009                 }
1010         }
1011
1012 ### Building the `follow` sets.
1013
1014 There are two different situations when we will want to generate "follow"
1015 sets.  If we are doing an SLR analysis, we want to generate a single
1016 "follow" set for each non-terminal in the grammar.  That is what is
1017 happening here.  If we are doing an LALR or LR analysis we will want
1018 to generate a separate "LA" set for each item.  We do that later
1019 in state generation.
1020
1021 There are two parts to generating a "follow" set.  Firstly we look at
1022 every place that any non-terminal appears in the body of any
1023 production, and we find the set of possible "first" symbols after
1024 there.  This is done using `add_first` above and only needs to be done
1025 once as the "first" sets are now stable and will not change.
1026
1027 ###### follow code
1028
1029         for (p = 0; p < g->production_count; p++) {
1030                 struct production *pr = g->productions[p];
1031                 int b;
1032
1033                 for (b = 0; b < pr->body_size - 1; b++) {
1034                         struct symbol *bs = pr->body[b];
1035                         if (bs->type == Terminal)
1036                                 continue;
1037                         add_first(pr, b+1, &g->follow[bs->num], g, NULL);
1038                 }
1039         }
1040
1041 The second part is to add the "follow" set of the head of a production
1042 to the "follow" sets of the final symbol in the production, and any
1043 other symbol which is followed only by `nullable` symbols.  As this
1044 depends on "follow" itself we need to repeatedly perform the process
1045 until no further changes happen.
1046
1047 ###### follow code
1048
1049         for (again = 0, p = 0;
1050              p < g->production_count;
1051              p < g->production_count-1
1052                 ? p++ : again ? (again = 0, p = 0)
1053                               : p++) {
1054                 struct production *pr = g->productions[p];
1055                 int b;
1056
1057                 for (b = pr->body_size - 1; b >= 0; b--) {
1058                         struct symbol *bs = pr->body[b];
1059                         if (bs->type == Terminal)
1060                                 break;
1061                         if (symset_union(&g->follow[bs->num],
1062                                          &g->follow[pr->head->num]))
1063                                 again = 1;
1064                         if (!bs->nullable)
1065                                 break;
1066                 }
1067         }
1068
1069 We now just need to create and initialise the `follow` list to get a
1070 complete function.
1071
1072 ###### grammar fields
1073         struct symset *follow;
1074
1075 ###### functions
1076         static void build_follow(struct grammar *g)
1077         {
1078                 int s, again, p;
1079                 g->follow = calloc(g->num_syms, sizeof(g->follow[0]));
1080                 for (s = 0; s < g->num_syms; s++)
1081                         g->follow[s] = INIT_SYMSET;
1082                 ## follow code
1083         }
1084
1085 ### Building itemsets and states
1086
1087 There are three different levels of detail that can be chosen for
1088 building the itemsets and states for the LR grammar.  They are:
1089
1090 1. LR(0) or SLR(1), where no look-ahead is considered.
1091 2. LALR(1) where we build look-ahead sets with each item and merge
1092    the LA sets when we find two paths to the same "kernel" set of items.
1093 3. LR(1) where different look-ahead for any item in the set means
1094    a different state must be created.
1095
1096 ###### forward declarations
1097         enum grammar_type { LR0, LR05, SLR, LALR, LR1 };
1098
1099 We need to be able to look through existing states to see if a newly
1100 generated state already exists.  For now we use a simple sorted linked
1101 list.
1102
1103 An item is a pair of numbers: the production number and the position of
1104 "DOT", which is an index into the body of the production.
1105 As the numbers are not enormous we can combine them into a single "short"
1106 and store them in a `symset` - 4 bits for "DOT" and 12 bits for the
1107 production number (so 4000 productions with maximum of 15 symbols in the
1108 body).
1109
1110 Comparing the itemsets will be a little different to comparing symsets
1111 as we want to do the lookup after generating the "kernel" of an
1112 itemset, so we need to ignore the offset=zero items which are added during
1113 completion.
1114
1115 To facilitate this, we modify the "DOT" number so that "0" sorts to
1116 the end of the list in the symset, and then only compare items before
1117 the first "0".
1118
1119 ###### declarations
1120         static inline unsigned short item_num(int production, int index)
1121         {
1122                 return production | ((31-index) << 11);
1123         }
1124         static inline int item_prod(unsigned short item)
1125         {
1126                 return item & 0x7ff;
1127         }
1128         static inline int item_index(unsigned short item)
1129         {
1130                 return (31-(item >> 11)) & 0x1f;
1131         }
1132
1133 For LR(1) analysis we need to compare not just the itemset in a state
1134 but also the LA sets.  As we assign each unique LA set a number, we
1135 can just compare the symset and the data values together.
1136
1137 ###### functions
1138         static int itemset_cmp(struct symset a, struct symset b,
1139                                enum grammar_type type)
1140         {
1141                 int i;
1142                 int av, bv;
1143
1144                 for (i = 0;
1145                      i < a.cnt && i < b.cnt &&
1146                      item_index(a.syms[i]) > 0 &&
1147                      item_index(b.syms[i]) > 0;
1148                      i++) {
1149                         int diff = a.syms[i] - b.syms[i];
1150                         if (diff)
1151                                 return diff;
1152                         if (type == LR1) {
1153                                 diff = a.data[i] - b.data[i];
1154                                 if (diff)
1155                                         return diff;
1156                         }
1157                 }
1158                 if (i == a.cnt || item_index(a.syms[i]) == 0)
1159                         av = -1;
1160                 else
1161                         av = a.syms[i];
1162                 if (i == b.cnt || item_index(b.syms[i]) == 0)
1163                         bv = -1;
1164                 else
1165                         bv = b.syms[i];
1166                 if (av - bv)
1167                         return av - bv;
1168                 if (type < LR1 || av == -1)
1169                         return 0;
1170                 return
1171                         a.data[i] - b.data[i];
1172         }
1173
1174 And now we can build the list of itemsets.  The lookup routine returns
1175 both a success flag and a pointer to where in the list an insert
1176 should happen, so we don't need to search a second time.
1177
1178 FIXME: document min_prefix
1179
1180 ###### declarations
1181         struct itemset {
1182                 struct itemset *next;
1183                 short state;
1184                 struct symset items;
1185                 struct symset go_to;
1186                 char completed;
1187                 char starts_line;
1188                 int min_prefix;
1189         };
1190
1191 ###### grammar fields
1192         struct itemset *items;
1193         int states;
1194
1195 ###### functions
1196         static int itemset_find(struct grammar *g, struct itemset ***where,
1197                                 struct symset kernel, enum grammar_type type)
1198         {
1199                 struct itemset **ip;
1200
1201                 for (ip = &g->items; *ip ; ip = & (*ip)->next) {
1202                         struct itemset *i = *ip;
1203                         int diff;
1204                         diff = itemset_cmp(i->items, kernel, type);
1205                         if (diff < 0)
1206                                 continue;
1207                         if (diff > 0)
1208                                 break;
1209                         /* found */
1210                         *where = ip;
1211                         return 1;
1212                 }
1213                 *where = ip;
1214                 return 0;
1215         }
1216
1217 Adding an itemset may require merging the LA sets if LALR analysis is
1218 happening. If any new LA set adds any symbols that weren't in the old LA set, we
1219 clear the `completed` flag so that the dependants of this itemset will be
1220 recalculated and their LA sets updated.
1221
1222 `add_itemset` must consume the symsets it is passed, either by adding
1223 them to a data structure, of freeing them.
1224
1225         static int add_itemset(struct grammar *g, struct symset ss,
1226                                enum grammar_type type)
1227         {
1228                 struct itemset **where, *is;
1229                 int i;
1230                 int found = itemset_find(g, &where, ss, type);
1231                 if (!found) {
1232                         is = calloc(1, sizeof(*is));
1233                         is->state = g->states;
1234                         g->states += 1;
1235                         is->items = ss;
1236                         is->next = *where;
1237                         is->go_to = INIT_DATASET;
1238                         *where = is;
1239                         return is->state;
1240                 }
1241                 is = *where;
1242                 if (type != LALR) {
1243                         symset_free(ss);
1244                         return is->state;
1245                 }
1246                 for (i = 0; i < ss.cnt; i++) {
1247                         struct symset temp = INIT_SYMSET, s;
1248                         if (ss.data[i] == is->items.data[i])
1249                                 continue;
1250                         s = set_find(g, is->items.data[i]);
1251                         symset_union(&temp, &s);
1252                         s = set_find(g, ss.data[i]);
1253                         if (symset_union(&temp, &s)) {
1254                                 is->items.data[i] = save_set(g, temp);
1255                                 is->completed = 0;
1256                         } else
1257                                 symset_free(temp);
1258                 }
1259                 symset_free(ss);
1260                 return is->state;
1261         }
1262
1263 #### The build
1264
1265 To build all the itemsets, we first insert the initial itemset made
1266 from production zero, complete each itemset, and then generate new
1267 itemsets from old until no new ones can be made.
1268
1269 Completing an itemset means finding all the items where "DOT" is followed by
1270 a nonterminal and adding "DOT=0" items for every production from that
1271 non-terminal - providing each item hasn't already been added.
1272
1273 If LA sets are needed, the LA set for each new item is found using
1274 `add_first` which was developed earlier for `FIRST` and `FOLLOW`.  This may
1275 be supplemented by the LA set for the item which produce the new item.
1276
1277 We also collect a set of all symbols which follow "DOT" (in `done`) as this
1278 is used in the next stage.
1279 If any of these symbols are flagged as starting a line, then this
1280 state must be a `starts_line` state so now is a good time to record that.
1281
1282 NOTE: precedence handling should happen here - I haven't written this yet
1283 though.
1284
1285 ###### complete itemset
1286         for (i = 0; i < is->items.cnt; i++) {
1287                 int p = item_prod(is->items.syms[i]);
1288                 int bs = item_index(is->items.syms[i]);
1289                 struct production *pr = g->productions[p];
1290                 int p2;
1291                 struct symbol *s;
1292                 struct symset LA = INIT_SYMSET;
1293                 unsigned short sn = 0;
1294
1295                 if (is->min_prefix == 0 ||
1296                     (bs > 0 && bs < is->min_prefix))
1297                         is->min_prefix = bs;
1298                 if (bs == pr->body_size)
1299                         continue;
1300                 s = pr->body[bs];
1301                 if (symset_find(&done, s->num) < 0) {
1302                         symset_add(&done, s->num, 0);
1303                         if (s->line_like)
1304                                 is->starts_line = 1;
1305                 }
1306                 if (s->type != Nonterminal)
1307                         continue;
1308                 again = 1;
1309                 if (type >= LALR) {
1310                         // Need the LA set.
1311                         int to_end;
1312                         add_first(pr, bs+1, &LA, g, &to_end);
1313                         if (to_end) {
1314                                 struct symset ss = set_find(g, is->items.data[i]);
1315                                 symset_union(&LA, &ss);
1316                         }
1317                         sn = save_set(g, LA);
1318                         LA = set_find(g, sn);
1319                 }
1320
1321                 /* Add productions for this symbol */
1322                 for (p2 = s->first_production;
1323                      p2 < g->production_count &&
1324                       g->productions[p2]->head == s;
1325                      p2++) {
1326                         int itm = item_num(p2, 0);
1327                         int pos = symset_find(&is->items, itm);
1328                         if (pos < 0) {
1329                                 symset_add(&is->items, itm, sn);
1330                                 /* Will have re-ordered, so start
1331                                  * from beginning again */
1332                                 i = -1;
1333                         } else if (type >= LALR) {
1334                                 struct symset ss = set_find(g, is->items.data[pos]);
1335                                 struct symset tmp = INIT_SYMSET;
1336
1337                                 symset_union(&tmp, &ss);
1338                                 if (symset_union(&tmp, &LA)) {
1339                                         is->items.data[pos] = save_set(g, tmp);
1340                                         i = -1;
1341                                 }else
1342                                         symset_free(tmp);
1343                         }
1344                 }
1345         }
1346
1347 For each symbol we found (and placed in `done`) we collect all the items for
1348 which this symbol is next, and create a new itemset with "DOT" advanced over
1349 the symbol.  This is then added to the collection of itemsets (or merged
1350 with a pre-existing itemset).
1351
1352 ###### derive itemsets
1353         // Now we have a completed itemset, so we need to
1354         // compute all the 'next' itemsets and create them
1355         // if they don't exist.
1356         for (i = 0; i < done.cnt; i++) {
1357                 int j;
1358                 unsigned short state;
1359                 struct symbol *sym = g->symtab[done.syms[i]];
1360                 struct symset newitemset = INIT_SYMSET;
1361                 if (type >= LALR)
1362                         newitemset = INIT_DATASET;
1363
1364                 for (j = 0; j < is->items.cnt; j++) {
1365                         int itm = is->items.syms[j];
1366                         int p = item_prod(itm);
1367                         int bp = item_index(itm);
1368                         struct production *pr = g->productions[p];
1369                         unsigned short la = 0;
1370                         int pos;
1371
1372                         if (bp == pr->body_size)
1373                                 continue;
1374                         if (pr->body[bp] != sym)
1375                                 continue;
1376                         if (type >= LALR)
1377                                 la = is->items.data[j];
1378                         pos = symset_find(&newitemset, pr->head->num);
1379                         if (pos < 0)
1380                                 symset_add(&newitemset, item_num(p, bp+1), la);
1381                         else if (type >= LALR) {
1382                                 // Need to merge la set.
1383                                 int la2 = newitemset.data[pos];
1384                                 if (la != la2) {
1385                                         struct symset ss = set_find(g, la2);
1386                                         struct symset LA = INIT_SYMSET;
1387                                         symset_union(&LA, &ss);
1388                                         ss = set_find(g, la);
1389                                         if (symset_union(&LA, &ss))
1390                                                 newitemset.data[pos] = save_set(g, LA);
1391                                         else
1392                                                 symset_free(LA);
1393                                 }
1394                         }
1395                 }
1396                 state = add_itemset(g, newitemset, type);
1397                 if (symset_find(&is->go_to, done.syms[i]) < 0)
1398                         symset_add(&is->go_to, done.syms[i], state);
1399         }
1400
1401 All that is left is to crate the initial itemset from production zero, and
1402 with `TK_eof` as the LA set.
1403
1404 ###### functions
1405         static void build_itemsets(struct grammar *g, enum grammar_type type)
1406         {
1407                 struct symset first = INIT_SYMSET;
1408                 struct itemset *is;
1409                 int again;
1410                 unsigned short la = 0;
1411                 if (type >= LALR) {
1412                         // LA set just has eof
1413                         struct symset eof = INIT_SYMSET;
1414                         symset_add(&eof, TK_eof, 0);
1415                         la = save_set(g, eof);
1416                         first = INIT_DATASET;
1417                 }
1418                 // production 0, offset 0 (with no data)
1419                 symset_add(&first, item_num(0, 0), la);
1420                 add_itemset(g, first, type);
1421                 for (again = 0, is = g->items;
1422                      is;
1423                      is = is->next ?: again ? (again = 0, g->items) : NULL) {
1424                         int i;
1425                         struct symset done = INIT_SYMSET;
1426                         if (is->completed)
1427                                 continue;
1428                         is->completed = 1;
1429                         again = 1;
1430                         ## complete itemset
1431                         ## derive itemsets
1432                         symset_free(done);
1433                 }
1434         }
1435
1436 ### Completing the analysis.
1437
1438 The exact process of analysis depends on which level was requested.  For
1439 `LR0` and `LR05` we don't need first and follow sets at all.  For `LALR` and
1440 `LR1` we need first, but not follow.  For `SLR` we need both.
1441
1442 We don't build the "action" tables that you might expect as the parser
1443 doesn't use them.  They will be calculated to some extent if needed for
1444 a report.
1445
1446 Once we have built everything we allocate arrays for the two lists:
1447 symbols and itemsets.  This allows more efficient access during reporting.
1448 The symbols are grouped as terminals and non-terminals and we record the
1449 changeover point in `first_nonterm`.
1450
1451 ###### grammar fields
1452         struct symbol **symtab;
1453         struct itemset **statetab;
1454         int first_nonterm;
1455
1456 ###### grammar_analyse
1457
1458         static void grammar_analyse(struct grammar *g, enum grammar_type type)
1459         {
1460                 struct symbol *s;
1461                 struct itemset *is;
1462                 int snum = TK_reserved;
1463                 for (s = g->syms; s; s = s->next)
1464                         if (s->num < 0 && s->type == Terminal) {
1465                                 s->num = snum;
1466                                 snum++;
1467                         }
1468                 g->first_nonterm = snum;
1469                 for (s = g->syms; s; s = s->next)
1470                         if (s->num < 0) {
1471                                 s->num = snum;
1472                                 snum++;
1473                         }
1474                 g->num_syms = snum;
1475                 g->symtab = calloc(g->num_syms, sizeof(g->symtab[0]));
1476                 for (s = g->syms; s; s = s->next)
1477                         g->symtab[s->num] = s;
1478
1479                 set_nullable(g);
1480                 set_can_eol(g);
1481                 set_line_like(g);
1482                 if (type >= SLR)
1483                         build_first(g);
1484
1485                 if (type == SLR)
1486                         build_follow(g);
1487
1488                 build_itemsets(g, type);
1489
1490                 g->statetab = calloc(g->states, sizeof(g->statetab[0]));
1491                 for (is = g->items; is ; is = is->next)
1492                         g->statetab[is->state] = is;
1493         }
1494
1495 ## Reporting on the Grammar
1496
1497 The purpose of the report is to give the grammar developer insight into
1498 how the grammar parser will work.  It is basically a structured dump of
1499 all the tables that have been generated, plus a description of any conflicts.
1500
1501 ###### grammar_report
1502         static int grammar_report(struct grammar *g, enum grammar_type type)
1503         {
1504                 report_symbols(g);
1505                 if (g->follow)
1506                         report_follow(g);
1507                 report_itemsets(g);
1508                 return report_conflicts(g, type);
1509         }
1510
1511 Firstly we have the complete list of symbols, together with the
1512 "FIRST" set if that was generated.  We add a mark to each symbol to
1513 show if it can end in a newline (`>`), if it is considered to be
1514 "line-like" (`<`), or if it is nullable (`.`).
1515
1516 ###### functions
1517
1518         static void report_symbols(struct grammar *g)
1519         {
1520                 int n;
1521                 if (g->first)
1522                         printf("SYMBOLS + FIRST:\n");
1523                 else
1524                         printf("SYMBOLS:\n");
1525
1526                 for (n = 0; n < g->num_syms; n++) {
1527                         struct symbol *s = g->symtab[n];
1528                         if (!s)
1529                                 continue;
1530
1531                         printf(" %c%c%c%3d%c: ",
1532                                s->nullable ? '.':' ',
1533                                s->can_eol ? '>':' ',
1534                                s->line_like ? '<':' ',
1535                                s->num, symtypes[s->type]);
1536                         prtxt(s->name);
1537                         if (s->precedence)
1538                                 printf(" (%d%s)", s->precedence,
1539                                        assoc_names[s->assoc]);
1540
1541                         if (g->first && s->type == Nonterminal) {
1542                                 int j;
1543                                 char c = ':';
1544                                 for (j = 0; j < g->first[n].cnt; j++) {
1545                                         printf("%c ", c);
1546                                         c = ',';
1547                                         prtxt(g->symtab[g->first[n].syms[j]]->name);
1548                                 }
1549                         }
1550                         printf("\n");
1551                 }
1552         }
1553
1554 Then we have the follow sets if they were computed.
1555
1556         static void report_follow(struct grammar *g)
1557         {
1558                 int n;
1559                 printf("FOLLOW:\n");
1560                 for (n = 0; n < g->num_syms; n++)
1561                         if (g->follow[n].cnt) {
1562                                 int j;
1563                                 char c = ':';
1564                                 printf("  ");
1565                                 prtxt(g->symtab[n]->name);
1566                                 for (j = 0; j < g->follow[n].cnt; j++) {
1567                                         printf("%c ", c);
1568                                         c = ',';
1569                                         prtxt(g->symtab[g->follow[n].syms[j]]->name);
1570                                 }
1571                                 printf("\n");
1572                         }
1573         }
1574
1575 And finally the item sets.  These include the GO TO tables and, for
1576 LALR and LR1, the LA set for each item.  Lots of stuff, so we break
1577 it up a bit.  First the items, with production number and associativity.
1578
1579         static void report_item(struct grammar *g, int itm)
1580         {
1581                 int p = item_prod(itm);
1582                 int dot = item_index(itm);
1583                 struct production *pr = g->productions[p];
1584                 int i;
1585
1586                 printf("    ");
1587                 prtxt(pr->head->name);
1588                 printf(" ->");
1589                 for (i = 0; i < pr->body_size; i++) {
1590                         printf(" %s", (dot == i ? ". ": ""));
1591                         prtxt(pr->body[i]->name);
1592                 }
1593                 if (dot == pr->body_size)
1594                         printf(" .");
1595                 printf(" [%d]", p);
1596                 if (pr->precedence)
1597                         printf(" (%d%s)", pr->precedence,
1598                                assoc_names[pr->assoc]);
1599                 printf("\n");
1600         }
1601
1602 The LA sets which are (possibly) reported with each item:
1603
1604         static void report_la(struct grammar *g, int lanum)
1605         {
1606                 struct symset la = set_find(g, lanum);
1607                 int i;
1608                 char c = ':';
1609
1610                 printf("        LOOK AHEAD(%d)", lanum);
1611                 for (i = 0; i < la.cnt; i++) {
1612                         printf("%c ", c);
1613                         c = ',';
1614                         prtxt(g->symtab[la.syms[i]]->name);
1615                 }
1616                 printf("\n");
1617         }
1618
1619 Then the go to sets:
1620
1621
1622         static void report_goto(struct grammar *g, struct symset gt)
1623         {
1624                 int i;
1625                 printf("    GOTO:\n");
1626
1627                 for (i = 0; i < gt.cnt; i++) {
1628                         printf("      ");
1629                         prtxt(g->symtab[gt.syms[i]]->name);
1630                         printf(" -> %d\n", gt.data[i]);
1631                 }
1632         }
1633
1634 Now we can report all the item sets complete with items, LA sets, and GO TO.
1635
1636         static void report_itemsets(struct grammar *g)
1637         {
1638                 int s;
1639                 printf("ITEM SETS(%d)\n", g->states);
1640                 for (s = 0; s < g->states; s++) {
1641                         int j;
1642                         struct itemset *is = g->statetab[s];
1643                         printf("  Itemset %d:%s min prefix=%d\n",
1644                                s, is->starts_line?" (startsline)":"", is->min_prefix);
1645                         for (j = 0; j < is->items.cnt; j++) {
1646                                 report_item(g, is->items.syms[j]);
1647                                 if (is->items.data != NO_DATA)
1648                                         report_la(g, is->items.data[j]);
1649                         }
1650                         report_goto(g, is->go_to);
1651                 }
1652         }
1653
1654 ### Reporting conflicts
1655
1656 Conflict detection varies a lot among different analysis levels.  However
1657 LR0 and LR0.5 are quite similar - having no follow sets, and SLR, LALR and
1658 LR1 are also similar as they have FOLLOW or LA sets.
1659
1660 ###### functions
1661
1662         ## conflict functions
1663
1664         static int report_conflicts(struct grammar *g, enum grammar_type type)
1665         {
1666                 int cnt = 0;
1667                 printf("Conflicts:\n");
1668                 if (type < SLR)
1669                         cnt = conflicts_lr0(g, type);
1670                 else
1671                         cnt = conflicts_slr(g, type);
1672                 if (cnt == 0)
1673                         printf(" - no conflicts\n");
1674                 return cnt;
1675         }
1676
1677 LR0 conflicts are any state which have both a reducible item and
1678 a shiftable item, or two reducible items.
1679
1680 LR05 conflicts only occur if two possible reductions exist,
1681 as shifts always over-ride reductions.
1682
1683 ###### conflict functions
1684         static int conflicts_lr0(struct grammar *g, enum grammar_type type)
1685         {
1686                 int i;
1687                 int cnt = 0;
1688                 for (i = 0; i < g->states; i++) {
1689                         struct itemset *is = g->statetab[i];
1690                         int last_reduce = -1;
1691                         int prev_reduce = -1;
1692                         int last_shift = -1;
1693                         int j;
1694                         if (!is)
1695                                 continue;
1696                         for (j = 0; j < is->items.cnt; j++) {
1697                                 int itm = is->items.syms[j];
1698                                 int p = item_prod(itm);
1699                                 int bp = item_index(itm);
1700                                 struct production *pr = g->productions[p];
1701
1702                                 if (bp == pr->body_size) {
1703                                         prev_reduce = last_reduce;
1704                                         last_reduce = j;
1705                                         continue;
1706                                 }
1707                                 if (pr->body[bp]->type == Terminal)
1708                                         last_shift = j;
1709                         }
1710                         if (type == LR0 && last_reduce >= 0 && last_shift >= 0) {
1711                                 printf("  State %d has both SHIFT and REDUCE:\n", i);
1712                                 report_item(g, is->items.syms[last_shift]);
1713                                 report_item(g, is->items.syms[last_reduce]);
1714                                 cnt++;
1715                         }
1716                         if (prev_reduce >= 0) {
1717                                 printf("  State %d has 2 (or more) reducible items\n", i);
1718                                 report_item(g, is->items.syms[prev_reduce]);
1719                                 report_item(g, is->items.syms[last_reduce]);
1720                                 cnt++;
1721                         }
1722                 }
1723                 return cnt;
1724         }
1725
1726 SLR, LALR, and LR1 conflicts happen if two reducible items have over-lapping
1727 look ahead, or if a symbol in a look-ahead can be shifted.  They differ only
1728 in the source of the look ahead set.
1729
1730 We build two datasets to reflect the "action" table: one which maps
1731 terminals to items where that terminal could be shifted and another
1732 which maps terminals to items that could be reduced when the terminal
1733 is in look-ahead.  We report when we get conflicts between the two.
1734
1735         static int conflicts_slr(struct grammar *g, enum grammar_type type)
1736         {
1737                 int i;
1738                 int cnt = 0;
1739
1740                 for (i = 0; i < g->states; i++) {
1741                         struct itemset *is = g->statetab[i];
1742                         struct symset shifts = INIT_DATASET;
1743                         struct symset reduce = INIT_DATASET;
1744                         int j;
1745                         if (!is)
1746                                 continue;
1747                         /* First collect the shifts */
1748                         for (j = 0; j < is->items.cnt; j++) {
1749                                 unsigned short itm = is->items.syms[j];
1750                                 int p = item_prod(itm);
1751                                 int bp = item_index(itm);
1752                                 struct production *pr = g->productions[p];
1753
1754                                 if (bp < pr->body_size &&
1755                                     pr->body[bp]->type == Terminal) {
1756                                         /* shiftable */
1757                                         int sym = pr->body[bp]->num;
1758                                         if (symset_find(&shifts, sym) < 0)
1759                                                 symset_add(&shifts, sym, itm);
1760                                 }
1761                         }
1762                         /* Now look for reduction and conflicts */
1763                         for (j = 0; j < is->items.cnt; j++) {
1764                                 unsigned short itm = is->items.syms[j];
1765                                 int p = item_prod(itm);
1766                                 int bp = item_index(itm);
1767                                 struct production *pr = g->productions[p];
1768
1769                                 if (bp < pr->body_size)
1770                                         continue;
1771                                 /* reducible */
1772                                 struct symset la;
1773                                 if (type == SLR)
1774                                         la = g->follow[pr->head->num];
1775                                 else
1776                                         la = set_find(g, is->items.data[j]);
1777                                 int k;
1778                                 for (k = 0; k < la.cnt; k++) {
1779                                         int pos = symset_find(&shifts, la.syms[k]);
1780                                         if (pos >= 0) {
1781                                                 printf("  State %d has SHIFT/REDUCE conflict on ", i);
1782                                                 prtxt(g->symtab[la.syms[k]]->name);
1783                                                 printf(":\n");
1784                                                 report_item(g, shifts.data[pos]);
1785                                                 report_item(g, itm);
1786                                                 cnt++;
1787                                         }
1788                                         pos = symset_find(&reduce, la.syms[k]);
1789                                         if (pos < 0) {
1790                                                 symset_add(&reduce, la.syms[k], itm);
1791                                                 continue;
1792                                         }
1793                                         printf("  State %d has REDUCE/REDUCE conflict on ", i);
1794                                         prtxt(g->symtab[la.syms[k]]->name);
1795                                         printf(":\n");
1796                                         report_item(g, itm);
1797                                         report_item(g, reduce.data[pos]);
1798                                         cnt++;
1799                                 }
1800                         }
1801                         symset_free(shifts);
1802                         symset_free(reduce);
1803                 }
1804                 return cnt;
1805         }
1806
1807
1808 ## Generating the parser
1809
1810 The exported part of the parser is the `parse_XX` function, where the name
1811 `XX` is based on the name of the parser files.
1812
1813 This takes a `code_node`, a partially initialized `token_config`, and an
1814 optional `FILE` to send tracing to.  The `token_config` gets the list of
1815 known words added and then is used with the `code_node` to initialize the
1816 scanner.
1817
1818 `parse_XX` then calls the library function `parser_run` to actually complete
1819 the parse.  This needs the `states` table and function to call the various
1820 pieces of code provided in the grammar file, so they are generated first.
1821
1822 ###### parser_generate
1823
1824         static void gen_parser(FILE *f, struct grammar *g, char *file, char *name)
1825         {
1826                 gen_known(f, g);
1827                 gen_non_term(f, g);
1828                 gen_goto(f, g);
1829                 gen_states(f, g);
1830                 gen_reduce(f, g, file);
1831                 gen_free(f, g);
1832
1833                 fprintf(f, "#line 0 \"gen_parser\"\n");
1834                 fprintf(f, "void *parse_%s(struct code_node *code, struct token_config *config, FILE *trace)\n",
1835                         name);
1836                 fprintf(f, "{\n");
1837                 fprintf(f, "\tstruct token_state *tokens;\n");
1838                 fprintf(f, "\tconfig->words_marks = known;\n");
1839                 fprintf(f, "\tconfig->known_count = sizeof(known)/sizeof(known[0]);\n");
1840                 fprintf(f, "\tconfig->ignored |= (1 << TK_line_comment) | (1 << TK_block_comment);\n");
1841                 fprintf(f, "\ttokens = token_open(code, config);\n");
1842                 fprintf(f, "\tvoid *rv = parser_run(tokens, states, do_reduce, do_free, trace, non_term, config);\n");
1843                 fprintf(f, "\ttoken_close(tokens);\n");
1844                 fprintf(f, "\treturn rv;\n");
1845                 fprintf(f, "}\n\n");
1846         }
1847
1848 ### Known words table
1849
1850 The known words table is simply an array of terminal symbols.
1851 The table of nonterminals used for tracing is a similar array.
1852
1853 ###### functions
1854
1855         static void gen_known(FILE *f, struct grammar *g)
1856         {
1857                 int i;
1858                 fprintf(f, "#line 0 \"gen_known\"\n");
1859                 fprintf(f, "static const char *known[] = {\n");
1860                 for (i = TK_reserved;
1861                      i < g->num_syms && g->symtab[i]->type == Terminal;
1862                      i++)
1863                         fprintf(f, "\t\"%.*s\",\n", g->symtab[i]->name.len,
1864                                 g->symtab[i]->name.txt);
1865                 fprintf(f, "};\n\n");
1866         }
1867
1868         static void gen_non_term(FILE *f, struct grammar *g)
1869         {
1870                 int i;
1871                 fprintf(f, "#line 0 \"gen_non_term\"\n");
1872                 fprintf(f, "static const char *non_term[] = {\n");
1873                 for (i = TK_reserved;
1874                      i < g->num_syms;
1875                      i++)
1876                         if (g->symtab[i]->type == Nonterminal)
1877                                 fprintf(f, "\t\"%.*s\",\n", g->symtab[i]->name.len,
1878                                         g->symtab[i]->name.txt);
1879                 fprintf(f, "};\n\n");
1880         }
1881
1882 ### States and the goto tables.
1883
1884 For each state we record the goto table, the reducible production if
1885 there is one, or a symbol to shift for error recovery.
1886 Some of the details of the reducible production are stored in the
1887 `do_reduce` function to come later.  Here we store the production number,
1888 the body size (useful for stack management) and the resulting symbol (useful
1889 for knowing how to free data later).
1890
1891 The go to table is stored in a simple array of `sym` and corresponding
1892 `state`.
1893
1894 ###### exported types
1895
1896         struct lookup {
1897                 short sym;
1898                 short state;
1899         };
1900         struct state {
1901                 short go_to_cnt;
1902                 const struct lookup * go_to;
1903                 short reduce_prod;
1904                 short reduce_size;
1905                 short reduce_sym;
1906                 short shift_sym;
1907                 short starts_line;
1908                 short min_prefix;
1909         };
1910
1911
1912 ###### functions
1913
1914         static void gen_goto(FILE *f, struct grammar *g)
1915         {
1916                 int i;
1917                 fprintf(f, "#line 0 \"gen_goto\"\n");
1918                 for (i = 0; i < g->states; i++) {
1919                         int j;
1920                         fprintf(f, "static const struct lookup goto_%d[] = {\n",
1921                                 i);
1922                         struct symset gt = g->statetab[i]->go_to;
1923                         for (j = 0; j < gt.cnt; j++)
1924                                 fprintf(f, "\t{ %d, %d },\n",
1925                                         gt.syms[j], gt.data[j]);
1926                         fprintf(f, "};\n");
1927                 }
1928         }
1929
1930 ###### functions
1931
1932         static void gen_states(FILE *f, struct grammar *g)
1933         {
1934                 int i;
1935                 fprintf(f, "#line 0 \"gen_states\"\n");
1936                 fprintf(f, "static const struct state states[] = {\n");
1937                 for (i = 0; i < g->states; i++) {
1938                         struct itemset *is = g->statetab[i];
1939                         int j, prod = -1, prod_len;
1940                         int shift_sym = -1;
1941                         int shift_len = 0, shift_remain = 0;
1942                         for (j = 0; j < is->items.cnt; j++) {
1943                                 int itm = is->items.syms[j];
1944                                 int p = item_prod(itm);
1945                                 int bp = item_index(itm);
1946                                 struct production *pr = g->productions[p];
1947
1948                                 if (bp < pr->body_size) {
1949                                         if (shift_sym < 0 ||
1950                                             (shift_len == bp && shift_remain > pr->body_size - bp)) {
1951                                                 shift_sym = pr->body[bp]->num;
1952                                                 shift_len = bp;
1953                                                 shift_remain = pr->body_size - bp;
1954                                         }
1955                                         continue;
1956                                 }
1957                                 /* This is what we reduce */
1958                                 if (prod < 0 || prod_len < pr->body_size) {
1959                                         prod = p;
1960                                         prod_len = pr->body_size;
1961                                 }
1962                         }
1963
1964                         if (prod >= 0)
1965                                 fprintf(f, "\t[%d] = { %d, goto_%d, %d, %d, %d, 0, %d, %d },\n",
1966                                         i, is->go_to.cnt, i, prod,
1967                                         g->productions[prod]->body_size,
1968                                         g->productions[prod]->head->num,
1969                                         is->starts_line, is->min_prefix);
1970                         else
1971                                 fprintf(f, "\t[%d] = { %d, goto_%d, -1, -1, -1, %d, %d, %d },\n",
1972                                         i, is->go_to.cnt, i, shift_sym,
1973                                         is->starts_line, is->min_prefix);
1974                 }
1975                 fprintf(f, "};\n\n");
1976         }
1977
1978 ### The `do_reduce` function and the code
1979
1980 When the parser engine decides to reduce a production, it calls `do_reduce`.
1981 This has two functions.
1982
1983 Firstly, if a non-NULL `trace` file is passed, it prints out details of the
1984 production being reduced.  Secondly it runs the code that was included with
1985 the production if any.
1986
1987 This code needs to be able to store data somewhere.  Rather than requiring
1988 `do_reduce` to `malloc` that "somewhere", we pass in a large buffer and have
1989 `do_reduce` return the size to be saved.
1990
1991 In order for the code to access "global" context, we pass in the
1992 "config" pointer that was passed to parser function.  If the `struct
1993 token_config` is embedded in some larger structure, the reducing code
1994 can access the larger structure using pointer manipulation.
1995
1996 The code fragment requires translation when written out.  Any `$N` needs to
1997 be converted to a reference either to that buffer (if `$0`) or to the
1998 structure returned by a previous reduction.  These pointers need to be cast
1999 to the appropriate type for each access.  All this is handled in
2000 `gen_code`.
2001
2002 `gen_code` also allows symbol references to contain a '`<`' as in '`$<2`'.
2003 This applied only to symbols with references (or pointers), not those with structures.
2004 The `<` implies that the reference it being moved out, so the object will not be
2005 automatically freed.  This is equivalent to assigning `NULL` to the pointer.
2006
2007 ###### functions
2008
2009         static void gen_code(struct production *p, FILE *f, struct grammar *g)
2010         {
2011                 char *c;
2012                 char *used = calloc(1, p->body_size);
2013                 int i;
2014
2015                 fprintf(f, "\t\t\t");
2016                 for (c = p->code.txt; c < p->code.txt + p->code.len; c++) {
2017                         int n;
2018                         int use = 0;
2019                         if (*c != '$') {
2020                                 fputc(*c, f);
2021                                 if (*c == '\n')
2022                                         fputs("\t\t\t", f);
2023                                 continue;
2024                         }
2025                         c++;
2026                         if (*c == '<') {
2027                                 use = 1;
2028                                 c++;
2029                         }
2030                         if (*c < '0' || *c > '9') {
2031                                 if (use)
2032                                         fputc('<', f);
2033                                 fputc(*c, f);
2034                                 continue;
2035                         }
2036                         n = *c - '0';
2037                         while (c[1] >= '0' && c[1] <= '9') {
2038                                 c += 1;
2039                                 n = n * 10 + *c - '0';
2040                         }
2041                         if (n == 0)
2042                                 fprintf(f, "(*(struct %.*s*%s)ret)",
2043                                         p->head->struct_name.len,
2044                                         p->head->struct_name.txt,
2045                                         p->head->isref ? "*":"");
2046                         else if (n > p->body_size)
2047                                 fprintf(f, "$%d", n);
2048                         else if (p->body[n-1]->type == Terminal)
2049                                 fprintf(f, "(*(struct token *)body[%d])",
2050                                         n-1);
2051                         else if (p->body[n-1]->struct_name.txt == NULL)
2052                                 fprintf(f, "$%d", n);
2053                         else {
2054                                 fprintf(f, "(*(struct %.*s*%s)body[%d])",
2055                                         p->body[n-1]->struct_name.len,
2056                                         p->body[n-1]->struct_name.txt,
2057                                         p->body[n-1]->isref ? "*":"", n-1);
2058                                 used[n-1] = use;
2059                         }
2060                 }
2061                 fputs("\n", f);
2062                 for (i = 0; i < p->body_size; i++) {
2063                         if (p->body[i]->struct_name.txt &&
2064                             p->body[i]->isref &&
2065                             used[i])
2066                                 // assume this has been copied out
2067                                 fprintf(f, "\t\t*(void**)body[%d] = NULL;\n", i);
2068                 }
2069                 free(used);
2070         }
2071
2072 ###### functions
2073
2074         static void gen_reduce(FILE *f, struct grammar *g, char *file)
2075         {
2076                 int i;
2077                 fprintf(f, "#line 0 \"gen_reduce\"\n");
2078                 fprintf(f, "static int do_reduce(int prod, void **body, struct token_config *config, void *ret)\n");
2079                 fprintf(f, "{\n");
2080                 fprintf(f, "\tint ret_size = 0;\n");
2081
2082                 fprintf(f, "\tswitch(prod) {\n");
2083                 for (i = 0; i < g->production_count; i++) {
2084                         struct production *p = g->productions[i];
2085                         fprintf(f, "\tcase %d:\n", i);
2086
2087                         if (p->code.txt)
2088                                 gen_code(p, f, g);
2089
2090                         if (p->head->struct_name.txt)
2091                                 fprintf(f, "\t\tret_size = sizeof(struct %.*s%s);\n",
2092                                         p->head->struct_name.len,
2093                                         p->head->struct_name.txt,
2094                                         p->head->isref ? "*":"");
2095
2096                         fprintf(f, "\t\tbreak;\n");
2097                 }
2098                 fprintf(f, "\t}\n\treturn ret_size;\n}\n\n");
2099         }
2100
2101 ### `do_free`
2102
2103 As each non-terminal can potentially cause a different type of data
2104 structure to be allocated and filled in, we need to be able to free it when
2105 done.
2106
2107 It is particularly important to have fine control over freeing during error
2108 recovery where individual stack frames might need to be freed.
2109
2110 For this, the grammar author is required to defined a `free_XX` function for
2111 each structure that is used by a non-terminal.  `do_free` will call whichever
2112 is appropriate given a symbol number, and will call `free` (as is
2113 appropriate for tokens) on any terminal symbol.
2114
2115 ###### functions
2116
2117         static void gen_free(FILE *f, struct grammar *g)
2118         {
2119                 int i;
2120
2121                 fprintf(f, "#line 0 \"gen_free\"\n");
2122                 fprintf(f, "static void do_free(short sym, void *asn)\n");
2123                 fprintf(f, "{\n");
2124                 fprintf(f, "\tif (!asn) return;\n");
2125                 fprintf(f, "\tif (sym < %d) {\n", g->first_nonterm);
2126                 fprintf(f, "\t\tfree(asn);\n\t\treturn;\n\t}\n");
2127                 fprintf(f, "\tswitch(sym) {\n");
2128
2129                 for (i = 0; i < g->num_syms; i++) {
2130                         struct symbol *s = g->symtab[i];
2131                         if (!s ||
2132                             s->type != Nonterminal ||
2133                             s->struct_name.txt == NULL)
2134                                 continue;
2135
2136                         fprintf(f, "\tcase %d:\n", s->num);
2137                         if (s->isref) {
2138                                 fprintf(f, "\t\tfree_%.*s(*(void**)asn);\n",
2139                                         s->struct_name.len,
2140                                         s->struct_name.txt);
2141                                 fprintf(f, "\t\tfree(asn);\n");
2142                         } else
2143                                 fprintf(f, "\t\tfree_%.*s(asn);\n",
2144                                         s->struct_name.len,
2145                                         s->struct_name.txt);
2146                         fprintf(f, "\t\tbreak;\n");
2147                 }
2148                 fprintf(f, "\t}\n}\n\n");
2149         }
2150
2151 ## The main routine.
2152
2153 There are three key parts to the "main" function of parsergen: processing
2154 the arguments, loading the grammar file, and dealing with the grammar.
2155
2156 ### Argument processing.
2157
2158 Command line options allow the selection of analysis mode, name of output
2159 file, and whether or not a report should be generated.  By default we create
2160 a report only if no code output was requested.
2161
2162 The `parse_XX` function name uses the basename of the output file which
2163 should not have a suffix (`.c`).  `.c` is added to the given name for the
2164 code, and `.h` is added for the header (if header text is specifed in the
2165 grammar file).
2166
2167 ###### includes
2168         #include <getopt.h>
2169
2170 ###### declarations
2171         static const struct option long_options[] = {
2172                 { "LR0",        0, NULL, '0' },
2173                 { "LR05",       0, NULL, '5' },
2174                 { "SLR",        0, NULL, 'S' },
2175                 { "LALR",       0, NULL, 'L' },
2176                 { "LR1",        0, NULL, '1' },
2177                 { "tag",        1, NULL, 't' },
2178                 { "report",     0, NULL, 'R' },
2179                 { "output",     1, NULL, 'o' },
2180                 { NULL,         0, NULL, 0   }
2181         };
2182         const char *options = "05SL1t:Ro:";
2183
2184 ###### process arguments
2185         int opt;
2186         char *outfile = NULL;
2187         char *infile;
2188         char *name;
2189         char *tag = NULL;
2190         int report = 1;
2191         enum grammar_type type = LR05;
2192         while ((opt = getopt_long(argc, argv, options,
2193                                   long_options, NULL)) != -1) {
2194                 switch(opt) {
2195                 case '0':
2196                         type = LR0; break;
2197                 case '5':
2198                         type = LR05; break;
2199                 case 'S':
2200                         type = SLR; break;
2201                 case 'L':
2202                         type = LALR; break;
2203                 case '1':
2204                         type = LR1; break;
2205                 case 'R':
2206                         report = 2; break;
2207                 case 'o':
2208                         outfile = optarg; break;
2209                 case 't':
2210                         tag = optarg; break;
2211                 default:
2212                         fprintf(stderr, "Usage: parsergen ...\n");
2213                         exit(1);
2214                 }
2215         }
2216         if (optind < argc)
2217                 infile = argv[optind++];
2218         else {
2219                 fprintf(stderr, "No input file given\n");
2220                 exit(1);
2221         }
2222         if (outfile && report == 1)
2223                 report = 0;
2224         name = outfile;
2225         if (name && strchr(name, '/'))
2226                 name = strrchr(name, '/')+1;
2227
2228         if (optind < argc) {
2229                 fprintf(stderr, "Excess command line arguments\n");
2230                 exit(1);
2231         }
2232
2233 ### Loading the grammar file
2234
2235 To be able to run `mdcode` and `scanner` on the grammar we need to memory
2236 map it.
2237
2238 Once we have extracted the code (with `mdcode`) we expect to find three
2239 sections: header, code, and grammar.  Anything else that is not
2240 excluded by the `--tag` option is an error.
2241
2242 "header" and "code" are optional, though it is hard to build a working
2243 parser with neither. "grammar" must be provided.
2244
2245 ###### includes
2246         #include <fcntl.h>
2247         #include <sys/mman.h>
2248         #include <errno.h>
2249
2250 ###### functions
2251         static int errs;
2252         static void pr_err(char *msg)
2253         {
2254                 errs++;
2255                 fprintf(stderr, "%s\n", msg);
2256         }
2257
2258 ###### load file
2259         struct section *table;
2260         int fd;
2261         int len;
2262         char *file;
2263         fd = open(infile, O_RDONLY);
2264         if (fd < 0) {
2265                 fprintf(stderr, "parsergen: cannot open %s: %s\n",
2266                         infile, strerror(errno));
2267                 exit(1);
2268         }
2269         len = lseek(fd, 0, 2);
2270         file = mmap(NULL, len, PROT_READ, MAP_SHARED, fd, 0);
2271         table = code_extract(file, file+len, pr_err);
2272
2273         struct code_node *hdr = NULL;
2274         struct code_node *code = NULL;
2275         struct code_node *gram = NULL;
2276         for (s = table; s; s = s->next) {
2277                 struct text sec = s->section;
2278                 if (tag && !strip_tag(&sec, tag))
2279                         continue;
2280                 if (text_is(sec, "header"))
2281                         hdr = s->code;
2282                 else if (text_is(sec, "code"))
2283                         code = s->code;
2284                 else if (text_is(sec, "grammar"))
2285                         gram = s->code;
2286                 else {
2287                         fprintf(stderr, "Unknown content section: %.*s\n",
2288                                 s->section.len, s->section.txt);
2289                         rv |= 2;
2290                 }
2291         }
2292
2293 ### Processing the input
2294
2295 As we need to append an extention to a filename and then open it for
2296 writing, and we need to do this twice, it helps to have a separate function.
2297
2298 ###### functions
2299
2300         static FILE *open_ext(char *base, char *ext)
2301         {
2302                 char *fn = malloc(strlen(base) + strlen(ext) + 1);
2303                 FILE *f;
2304                 strcat(strcpy(fn, base), ext);
2305                 f = fopen(fn, "w");
2306                 free(fn);
2307                 return f;
2308         }
2309
2310 If we can read the grammar, then we analyse and optionally report on it.  If
2311 the report finds conflicts we will exit with an error status.
2312
2313 ###### process input
2314         struct grammar *g = NULL;
2315         if (gram == NULL) {
2316                 fprintf(stderr, "No grammar section provided\n");
2317                 rv |= 2;
2318         } else {
2319                 g = grammar_read(gram);
2320                 if (!g) {
2321                         fprintf(stderr, "Failure to parse grammar\n");
2322                         rv |= 2;
2323                 }
2324         }
2325         if (g) {
2326                 grammar_analyse(g, type);
2327                 if (report)
2328                         if (grammar_report(g, type))
2329                                 rv |= 1;
2330         }
2331
2332 If a "headers" section is defined, we write it out and include a declaration
2333 for the `parse_XX` function so it can be used from separate code.
2334
2335         if (rv == 0 && hdr && outfile) {
2336                 FILE *f = open_ext(outfile, ".h");
2337                 if (f) {
2338                         code_node_print(f, hdr, infile);
2339                         fprintf(f, "void *parse_%s(struct code_node *code, struct token_config *config, FILE *trace);\n",
2340                                 name);
2341                         fclose(f);
2342                 } else {
2343                         fprintf(stderr, "Cannot create %s.h\n",
2344                                 outfile);
2345                         rv |= 4;
2346                 }
2347         }
2348
2349 And if all goes well and an output file was provided, we create the `.c`
2350 file with the code section (if any) and the parser tables and function.
2351
2352         if (rv == 0 && outfile) {
2353                 FILE *f = open_ext(outfile, ".c");
2354                 if (f) {
2355                         if (code)
2356                                 code_node_print(f, code, infile);
2357                         gen_parser(f, g, infile, name);
2358                         fclose(f);
2359                 } else {
2360                         fprintf(stderr, "Cannot create %s.c\n",
2361                                 outfile);
2362                         rv |= 4;
2363                 }
2364         }
2365
2366 And that about wraps it up.  We need to set the locale so that UTF-8 is
2367 recognised properly, and link with `libicuuc` as `libmdcode` requires that.
2368
2369 ###### File: parsergen.mk
2370         parsergen : parsergen.o libscanner.o libmdcode.o
2371                 $(CC) $(CFLAGS) -o parsergen parsergen.o libscanner.o libmdcode.o -licuuc
2372
2373 ###### includes
2374         #include <locale.h>
2375
2376 ###### main
2377
2378         int main(int argc, char *argv[])
2379         {
2380                 struct section *s;
2381                 int rv = 0;
2382
2383                 setlocale(LC_ALL,"");
2384
2385                 ## process arguments
2386                 ## load file
2387                 ## process input
2388
2389                 return rv;
2390         }
2391
2392 ## The SHIFT/REDUCE parser
2393
2394 Having analysed the grammar and generated all the tables, we only need the
2395 shift/reduce engine to bring it all together.
2396
2397 ### Goto table lookup
2398
2399 The parser generator has nicely provided us with goto tables sorted by
2400 symbol number.  We need a binary search function to find a symbol in the
2401 table.
2402
2403 ###### parser functions
2404
2405         static int search(const struct state *l, int sym)
2406         {
2407                 int lo = 0;
2408                 int hi = l->go_to_cnt;
2409
2410                 if (hi == 0)
2411                         return -1;
2412                 while (lo + 1 < hi) {
2413                         int mid = (lo + hi) / 2;
2414                         if (l->go_to[mid].sym <= sym)
2415                                 lo = mid;
2416                         else
2417                                 hi = mid;
2418                 }
2419                 if (l->go_to[lo].sym == sym)
2420                         return l->go_to[lo].state;
2421                 else
2422                         return -1;
2423         }
2424
2425 ### The state stack.
2426
2427 The core data structure for the parser is the stack.  This tracks all the
2428 symbols that have been recognised or partially recognised.
2429
2430 The stack usually won't grow very large - maybe a few tens of entries.  So
2431 we dynamically resize and array as required but never bother to shrink it
2432 down again.
2433
2434 We keep the stack as two separate allocations.  One, `asn_stack` stores the
2435 "abstract syntax nodes" which are created by each reduction.  When we call
2436 `do_reduce` we need to pass an array of the `asn`s of the body of the
2437 production, and by keeping a separate `asn` stack, we can just pass a
2438 pointer into this stack.
2439
2440 The other allocation stores all other stack fields of which there are six.
2441 The `state` is the most important one and guides the parsing process.  The
2442 `sym` is nearly unnecessary.  However when we want to free entries from the
2443 `asn_stack`, it helps to know what type they are so we can call the right
2444 freeing function.  The symbol leads us to the right free function through
2445 `do_free`.
2446
2447 The `indents` count tracks the line indents with-in the symbol or
2448 immediately follow it.  These are used to allow indent information to
2449 guide parsing and error recovery.
2450
2451 `since_newline` tracks how many stack frames since the last
2452 start-of-line (whether indented or not).  So if `since_newline` is
2453 zero, then this symbol is at the start of a line.  Similarly
2454 `since_indent` counts the number of states since an indent, it is zero
2455 precisely when `indents` is not zero.
2456
2457 `newline_permitted` keeps track of whether newlines should be ignored
2458 or not.
2459
2460 The stack is most properly seen as alternating states and symbols -
2461 states, like the 'DOT' in items, are between symbols.  Each frame in
2462 our stack holds a state and the symbol that was before it.  The
2463 bottom of stack holds the start state but no symbol, as nothing came
2464 before the beginning.
2465
2466 ###### parser functions
2467
2468         struct parser {
2469                 struct frame {
2470                         short state;
2471                         short newline_permitted;
2472
2473                         short sym;
2474                         short indents;
2475                         short since_newline;
2476                         short since_indent;
2477                 } *stack;
2478                 void **asn_stack;
2479                 int stack_size;
2480                 int tos;
2481         };
2482
2483 #### Shift and pop
2484
2485 Two operations are needed on the stack - shift (which is like push) and pop.
2486
2487 Shift applies not only to terminals but also to non-terminals.  When
2488 we reduce a production we will pop off entries corresponding to the
2489 body symbols, then push on an item for the head of the production.
2490 This last is exactly the same process as shifting in a terminal so we
2491 use the same function for both.  In both cases we provide the symbol,
2492 the number of indents the symbol contains (which will be zero for a
2493 terminal symbol) and a flag indicating the the symbol was at (or was
2494 reduced from a symbol which was at) the start of a line.  The state is
2495 deduced from the current top-of-stack state and the new symbol.
2496
2497 To simplify other code we arrange for `shift` to fail if there is no `goto`
2498 state for the symbol.  This is useful in basic parsing due to our design
2499 that we shift when we can, and reduce when we cannot.  So the `shift`
2500 function reports if it could.
2501
2502 `shift` is also used to push state zero onto the stack, so if the
2503 stack is empty, it always chooses zero as the next state.
2504
2505 So `shift` finds the next state.  If that succeeds it extends the
2506 allocations if needed and pushes all the information onto the stacks.
2507
2508 Newlines are permitted after a `starts_line` state until an internal
2509 indent.  If the new frame has neither a `starts_line` state nor an
2510 indent, newlines are permitted if the previous stack frame permitted
2511 them.
2512
2513 ###### parser functions
2514
2515         static int shift(struct parser *p,
2516                          short sym, short indents, short start_of_line,
2517                          void *asn,
2518                          const struct state states[])
2519         {
2520                 // Push an entry onto the stack
2521                 struct frame next = {0};
2522                 int newstate = p->tos
2523                         ? search(&states[p->stack[p->tos-1].state],
2524                                  sym)
2525                         : 0;
2526                 if (newstate < 0)
2527                         return 0;
2528                 if (p->tos >= p->stack_size) {
2529                         p->stack_size += 10;
2530                         p->stack = realloc(p->stack, p->stack_size
2531                                            * sizeof(p->stack[0]));
2532                         p->asn_stack = realloc(p->asn_stack, p->stack_size
2533                                            * sizeof(p->asn_stack[0]));
2534                 }
2535                 next.sym = sym;
2536                 next.indents = indents;
2537                 next.state = newstate;
2538                 if (states[newstate].starts_line)
2539                         next.newline_permitted = 1;
2540                 else if (indents)
2541                         next.newline_permitted = 0;
2542                 else if (p->tos)
2543                         next.newline_permitted =
2544                                 p->stack[p->tos-1].newline_permitted;
2545                 else
2546                         next.newline_permitted = 0;
2547
2548                 if (!start_of_line) {
2549                         if (p->tos)
2550                                 next.since_newline = p->stack[p->tos-1].since_newline + 1;
2551                         else
2552                                 next.since_newline = 1;
2553                 }
2554                 if (indents)
2555                         next.since_indent = 0;
2556                 else if (p->tos)
2557                         next.since_indent = p->stack[p->tos-1].since_indent + 1;
2558                 else
2559                         next.since_indent = 1;
2560
2561                 p->stack[p->tos] = next;
2562                 p->asn_stack[p->tos] = asn;
2563                 p->tos++;
2564                 return 1;
2565         }
2566
2567 `pop` primarily moves the top of stack (`tos`) back down the required
2568 amount and frees any `asn` entries that need to be freed.  It also
2569 collects a summary of the indents and line starts in the symbols that
2570 are being removed. It is called _after_ we reduce a production, just
2571 before we `shift` the nonterminal in.
2572
2573 ###### parser functions
2574
2575         static int pop(struct parser *p, int num,
2576                        short *start_of_line,
2577                        void(*do_free)(short sym, void *asn))
2578         {
2579                 int i;
2580                 short indents = 0;
2581                 int sol = 0;
2582
2583                 p->tos -= num;
2584                 for (i = 0; i < num; i++) {
2585                         sol |= !p->stack[p->tos+i].since_newline;
2586                         indents += p->stack[p->tos+i].indents;
2587                         do_free(p->stack[p->tos+i].sym,
2588                                 p->asn_stack[p->tos+i]);
2589                 }
2590                 if (start_of_line)
2591                         *start_of_line = sol;
2592                 return indents;
2593         }
2594
2595 ### Memory allocation
2596
2597 The `scanner` returns tokens in a local variable - we want them in allocated
2598 memory so they can live in the `asn_stack`.  Similarly the `asn` produced by
2599 a reduce is in a large buffer.  Both of these require some allocation and
2600 copying, hence `memdup` and `tokcopy`.
2601
2602 ###### parser includes
2603         #include <memory.h>
2604
2605 ###### parser functions
2606
2607         void *memdup(void *m, int len)
2608         {
2609                 void *ret;
2610                 if (len == 0)
2611                         return NULL;
2612                 ret = malloc(len);
2613                 memcpy(ret, m, len);
2614                 return ret;
2615         }
2616
2617         static struct token *tok_copy(struct token tk)
2618         {
2619                 struct token *new = malloc(sizeof(*new));
2620                 *new = tk;
2621                 return new;
2622         }
2623
2624 ### The heart of the parser.
2625
2626 Now we have the parser.  If we can shift we do, though newlines and
2627 reducing indenting may block that.  If not and we can reduce we do
2628 that.  If the production we reduced was production zero, then we have
2629 accepted the input and can finish.
2630
2631 We return whatever `asn` was returned by reducing production zero.
2632
2633 If we can neither shift nor reduce we have an error to handle.  We pop
2634 single entries off the stack until we can shift the `TK_error` symbol, then
2635 drop input tokens until we find one we can shift into the new error state.
2636
2637 When we find `TK_in` and `TK_out` tokens which report indents we need
2638 to handle them directly as the grammar cannot express what we want to
2639 do with them.
2640
2641 `TK_in` tokens are easy: we simply update indent count in the top stack frame to
2642 record how many indents there are following the previous token.
2643
2644 `TK_out` tokens must be canceled against an indent count
2645 within the stack.  If we can reduce some symbols that are all since
2646 the most recent indent, then we do that first.  If the minimum prefix
2647 of the current state then extends back before the most recent indent,
2648 that indent can be cancelled.  If the minimum prefix is shorter then
2649 the indent is premature and we must start error handling, which
2650 currently doesn't work at all.
2651
2652 `TK_newline` tokens are ignored unless the top stack frame records
2653 that they are permitted.  In that case they will not be considered for
2654 shifting if it is possible to reduce some symbols that are all since
2655 the most recent start of line.  This is how a newline forcible
2656 terminates any line-like structure - we try to reduce down to at most
2657 one symbol for each line where newlines are allowed.
2658
2659 ###### parser includes
2660         #include "parser.h"
2661 ###### parser_run
2662         void *parser_run(struct token_state *tokens,
2663                          const struct state states[],
2664                          int (*do_reduce)(int, void**, struct token_config*, void*),
2665                          void (*do_free)(short, void*),
2666                          FILE *trace, const char *non_term[],
2667                          struct token_config *config)
2668         {
2669                 struct parser p = { 0 };
2670                 struct token *tk = NULL;
2671                 int accepted = 0;
2672                 void *ret = NULL;
2673
2674                 shift(&p, TK_eof, 0, 1, NULL, states);
2675                 while (!accepted) {
2676                         struct token *err_tk;
2677                         struct frame *tos = &p.stack[p.tos-1];
2678                         if (!tk)
2679                                 tk = tok_copy(token_next(tokens));
2680                         parser_trace(trace, &p,
2681                                      tk, states, non_term, config->known_count);
2682
2683                         if (tk->num == TK_in) {
2684                                 tos->indents += 1;
2685                                 tos->since_newline = 0;
2686                                 tos->since_indent = 0;
2687                                 if (!states[tos->state].starts_line)
2688                                         tos->newline_permitted = 0;
2689                                 free(tk);
2690                                 tk = NULL;
2691                                 parser_trace_action(trace, "Record");
2692                                 continue;
2693                         }
2694                         if (tk->num == TK_out) {
2695                                 if (states[tos->state].reduce_size >= 0 &&
2696                                     states[tos->state].reduce_size <= tos->since_indent)
2697                                         goto force_reduce;
2698                                 if (states[tos->state].min_prefix >= tos->since_indent) {
2699                                         // OK to cancel
2700                                         struct frame *in = tos - tos->since_indent;
2701                                         in->indents -= 1;
2702                                         if (in->indents == 0) {
2703                                                 /* Reassess since_indent and newline_permitted */
2704                                                 if (in > p.stack) {
2705                                                         in->since_indent = in[-1].since_indent + 1;
2706                                                         in->newline_permitted = in[-1].newline_permitted;
2707                                                 } else {
2708                                                         in->since_indent = 0;
2709                                                         in->newline_permitted = 0;
2710                                                 }
2711                                                 if (states[in->state].starts_line)
2712                                                         in->newline_permitted = 1;
2713                                                 while (in < tos) {
2714                                                         in += 1;
2715                                                         in->since_indent = in[-1].since_indent + 1;
2716                                                         if (states[in->state].starts_line)
2717                                                                 in->newline_permitted = 1;
2718                                                         else
2719                                                                 in->newline_permitted = in[-1].newline_permitted;
2720                                                 }
2721                                         }
2722                                         free(tk);
2723                                         tk = NULL;
2724                                         parser_trace_action(trace, "Cancel");
2725                                         continue;
2726                                 }
2727                                 // fall through and force a REDUCE (as 'shift'
2728                                 // will fail).
2729                         }
2730                         if (tk->num == TK_newline) {
2731                                 if (!tos->newline_permitted) {
2732                                         free(tk);
2733                                         tk = NULL;
2734                                         parser_trace_action(trace, "Discard");
2735                                         continue;
2736                                 }
2737                                 if (tos->since_newline > 1 &&
2738                                     states[tos->state].reduce_size >= 0 &&
2739                                     states[tos->state].reduce_size <= tos->since_newline)
2740                                         goto force_reduce;
2741                         }
2742                         if (shift(&p, tk->num, 0, tk->num == TK_newline, tk, states)) {
2743                                 tk = NULL;
2744                                 parser_trace_action(trace, "Shift");
2745                                 continue;
2746                         }
2747                 force_reduce:
2748                         if (states[tos->state].reduce_prod >= 0) {
2749                                 void **body;
2750                                 void *res;
2751                                 const struct state *nextstate = &states[tos->state];
2752                                 int prod = nextstate->reduce_prod;
2753                                 int size = nextstate->reduce_size;
2754                                 int bufsize;
2755                                 static char buf[16*1024];
2756                                 short indents, start_of_line;
2757
2758                                 body = p.asn_stack + (p.tos - size);
2759
2760                                 bufsize = do_reduce(prod, body, config, buf);
2761
2762                                 indents = pop(&p, size, &start_of_line,
2763                                               do_free);
2764                                 res = memdup(buf, bufsize);
2765                                 memset(buf, 0, bufsize);
2766                                 if (!shift(&p, nextstate->reduce_sym,
2767                                            indents, start_of_line,
2768                                            res, states)) {
2769                                         if (prod != 0) abort();
2770                                         accepted = 1;
2771                                         ret = res;
2772                                 }
2773                                 parser_trace_action(trace, "Reduce");
2774                                 continue;
2775                         }
2776                         if (tk->num == TK_out) {
2777                                 // Indent problem - synthesise tokens to get us
2778                                 // out of here.
2779                                 fprintf(stderr, "Synthesize %d to handle indent problem\n", states[tos->state].shift_sym);
2780                                 shift(&p, states[tos->state].shift_sym,
2781                                       0, 1, tok_copy(*tk), states);
2782                                 // FIXME need to report this error somehow
2783                                 parser_trace_action(trace, "Synthesize");
2784                                 continue;
2785                         }
2786                         /* Error. We walk up the stack until we
2787                          * find a state which will accept TK_error.
2788                          * We then shift in TK_error and see what state
2789                          * that takes us too.
2790                          * Then we discard input tokens until
2791                          * we find one that is acceptable.
2792                          */
2793                         parser_trace_action(trace, "ERROR");
2794                         short indents = 0, start_of_line;
2795
2796                         err_tk = tok_copy(*tk);
2797                         while (shift(&p, TK_error, 0, 0,
2798                                      err_tk, states) == 0
2799                                && p.tos > 0)
2800                                 // discard this state
2801                                 indents += pop(&p, 1, &start_of_line, do_free);
2802                         if (p.tos == 0) {
2803                                 free(err_tk);
2804                                 // no state accepted TK_error
2805                                 break;
2806                         }
2807                         tos = &p.stack[p.tos-1];
2808                         while (search(&states[tos->state], tk->num) < 0 &&
2809                                tk->num != TK_eof) {
2810                                 free(tk);
2811                                 tk = tok_copy(token_next(tokens));
2812                                 if (tk->num == TK_in)
2813                                         indents += 1;
2814                                 if (tk->num == TK_out) {
2815                                         if (indents == 0)
2816                                                 break;
2817                                         indents -= 1;
2818                                         // FIXME update since_indent here
2819                                 }
2820                         }
2821                         if (p.tos == 0 && tk->num == TK_eof)
2822                                 break;
2823                         tos = &p.stack[p.tos-1];
2824                         tos->indents += indents;
2825                         exit(1);
2826                 }
2827                 free(tk);
2828                 pop(&p, p.tos, NULL, do_free);
2829                 free(p.asn_stack);
2830                 free(p.stack);
2831                 return ret;
2832         }
2833
2834 ###### exported functions
2835         void *parser_run(struct token_state *tokens,
2836                          const struct state states[],
2837                          int (*do_reduce)(int, void**, struct token_config*, void*),
2838                          void (*do_free)(short, void*),
2839                          FILE *trace, const char *non_term[],
2840                          struct token_config *config);
2841
2842 ### Tracing
2843
2844 Being able to visualize the parser in action can be invaluable when
2845 debugging the parser code, or trying to understand how the parse of a
2846 particular grammar progresses.  The stack contains all the important
2847 state, so just printing out the stack every time around the parse loop
2848 can make it possible to see exactly what is happening.
2849
2850 This doesn't explicitly show each SHIFT and REDUCE action.  However they
2851 are easily deduced from the change between consecutive lines, and the
2852 details of each state can be found by cross referencing the states list
2853 in the stack with the "report" that parsergen can generate.
2854
2855 For terminal symbols, we just dump the token.  For non-terminals we
2856 print the name of the symbol.  The look ahead token is reported at the
2857 end inside square brackets.
2858
2859 ###### parser functions
2860
2861         static char *reserved_words[] = {
2862                 [TK_error]        = "ERROR",
2863                 [TK_in]           = "IN",
2864                 [TK_out]          = "OUT",
2865                 [TK_newline]      = "NEWLINE",
2866                 [TK_eof]          = "$eof",
2867         };
2868         static void parser_trace_state(FILE *trace, struct frame *f, const struct state states[])
2869         {
2870                 fprintf(trace, "(%d", f->state);
2871                 if (states[f->state].starts_line)
2872                         fprintf(trace, "s");
2873                 if (f->newline_permitted)
2874                         fprintf(trace, "n%d", f->since_newline);
2875                 fprintf(trace, ") ");
2876         }
2877
2878         void parser_trace(FILE *trace, struct parser *p,
2879                           struct token *tk, const struct state states[],
2880                           const char *non_term[], int knowns)
2881         {
2882                 int i;
2883                 if (!trace)
2884                         return;
2885                 for (i = 0; i < p->tos; i++) {
2886                         struct frame *f = &p->stack[i];
2887                         if (i) {
2888                                 int sym = f->sym;
2889                                 if (sym < TK_reserved &&
2890                                     reserved_words[sym] != NULL)
2891                                         fputs(reserved_words[sym], trace);
2892                                 else if (sym < TK_reserved + knowns) {
2893                                         struct token *t = p->asn_stack[i];
2894                                         text_dump(trace, t->txt, 20);
2895                                 } else
2896                                         fputs(non_term[sym - TK_reserved - knowns],
2897                                               trace);
2898                                 if (f->indents)
2899                                         fprintf(trace, ".%d", f->indents);
2900                                 if (f->since_newline == 0)
2901                                         fputs("/", trace);
2902                                 fputs(" ", trace);
2903                         }
2904                         parser_trace_state(trace, f, states);
2905                 }
2906                 fprintf(trace, "[");
2907                 if (tk->num < TK_reserved &&
2908                     reserved_words[tk->num] != NULL)
2909                         fputs(reserved_words[tk->num], trace);
2910                 else
2911                         text_dump(trace, tk->txt, 20);
2912                 fputs("]", trace);
2913         }
2914
2915         void parser_trace_action(FILE *trace, char *action)
2916         {
2917                 if (trace)
2918                         fprintf(trace, " - %s\n", action);
2919         }
2920
2921 # A Worked Example
2922
2923 The obvious example for a parser is a calculator.
2924
2925 As `scanner` provides number parsing function using `libgmp` is it not much
2926 work to perform arbitrary rational number calculations.
2927
2928 This calculator takes one expression, or an equality test, per line.  The
2929 results are printed and if any equality test fails, the program exits with
2930 an error.
2931
2932 ###### File: parsergen.mk
2933         calc.c calc.h : parsergen parsergen.mdc
2934                 ./parsergen --tag calc -o calc parsergen.mdc
2935         calc : calc.o libparser.o libscanner.o libmdcode.o libnumber.o
2936                 $(CC) $(CFLAGS) -o calc calc.o libparser.o libscanner.o libmdcode.o libnumber.o -licuuc -lgmp
2937
2938 # calc: header
2939
2940         #include "number.h"
2941         // what do we use for a demo-grammar?  A calculator of course.
2942         struct number {
2943                 mpq_t val;
2944                 char tail[2];
2945                 int err;
2946         };
2947
2948 # calc: code
2949
2950         #include <stdlib.h>
2951         #include <unistd.h>
2952         #include <fcntl.h>
2953         #include <sys/mman.h>
2954         #include <stdio.h>
2955         #include <malloc.h>
2956         #include <gmp.h>
2957         #include "mdcode.h"
2958         #include "scanner.h"
2959         #include "number.h"
2960         #include "parser.h"
2961
2962         #include "calc.h"
2963
2964         static void free_number(struct number *n)
2965         {
2966                 mpq_clear(n->val);
2967                 free(n);
2968         }
2969
2970         int main(int argc, char *argv[])
2971         {
2972                 int fd = open(argv[1], O_RDONLY);
2973                 int len = lseek(fd, 0, 2);
2974                 char *file = mmap(NULL, len, PROT_READ, MAP_SHARED, fd, 0);
2975                 struct section *s = code_extract(file, file+len, NULL);
2976                 struct token_config config = {
2977                         .ignored = (1 << TK_line_comment)
2978                                  | (1 << TK_block_comment)
2979                                  | (1 << TK_in)
2980                                  | (1 << TK_out),
2981                         .number_chars = ".,_+-",
2982                         .word_start = "",
2983                         .word_cont = "",
2984                 };
2985                 parse_calc(s->code, &config, argc > 2 ? stderr : NULL);
2986                 while (s) {
2987                         struct section *t = s->next;
2988                         code_free(s->code);
2989                         free(s);
2990                         s = t;
2991                 }
2992                 exit(0);
2993         }
2994
2995 # calc: grammar
2996
2997         Session -> Session Line
2998                 | Line
2999
3000         Line -> Expression NEWLINE ${ gmp_printf("Answer = %Qd\n", $1.val);
3001                                         { mpf_t fl; mpf_init2(fl, 20); mpf_set_q(fl, $1.val);
3002                                         gmp_printf("  or as a decimal: %Fg\n", fl);
3003                                         mpf_clear(fl);
3004                                         }
3005                                      }$
3006                 | Expression = Expression NEWLINE ${
3007                         if (mpq_equal($1.val, $3.val))
3008                                 gmp_printf("Both equal %Qd\n", $1.val);
3009                         else {
3010                                 gmp_printf("NOT EQUAL: %Qd\n      != : %Qd\n",
3011                                         $1.val, $3.val);
3012                                 exit(1);
3013                         }
3014                 }$
3015                 | NEWLINE ${ printf("Blank line\n"); }$
3016                 | ERROR NEWLINE ${ printf("Skipped a bad line\n"); }$
3017
3018         $number
3019         Expression -> Expression + Term ${ mpq_init($0.val); mpq_add($0.val, $1.val, $3.val); }$
3020                 | Expression - Term ${ mpq_init($0.val); mpq_sub($0.val, $1.val, $3.val); }$
3021                 | Term ${ mpq_init($0.val); mpq_set($0.val, $1.val); }$
3022
3023         Term -> Term * Factor ${ mpq_init($0.val); mpq_mul($0.val, $1.val, $3.val); }$
3024                 | Term / Factor ${ mpq_init($0.val); mpq_div($0.val, $1.val, $3.val); }$
3025                 | Factor ${ mpq_init($0.val); mpq_set($0.val, $1.val); }$
3026
3027         Factor -> NUMBER ${ if (number_parse($0.val, $0.tail, $1.txt) == 0) mpq_init($0.val); }$
3028                 | ( Expression ) ${ mpq_init($0.val); mpq_set($0.val, $2.val); }$