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