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