]> ocean-lang.org Git - ocean/blob - csrc/parsergen.mdc
a913cb912c77cf5a977e835b4bd1ec8ac212929b
[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
173         static struct { int num; char *name; } reserved_words[] = {
174                 { TK_error,        "ERROR" },
175                 { TK_number,       "NUMBER" },
176                 { TK_ident,        "IDENTIFIER" },
177                 { TK_mark,         "MARK" },
178                 { TK_string,       "STRING" },
179                 { TK_multi_string, "MULTI_STRING" },
180                 { TK_in,           "IN" },
181                 { TK_out,          "OUT" },
182                 { TK_newline,      "NEWLINE" },
183                 { TK_eof,          "$eof" },
184         };
185 ###### symbol fields
186         short num;
187
188 Note that `TK_eof` and the two `TK_*_comment` tokens cannot be
189 recognised.  The former is automatically expected at the end of the text
190 being parsed. The latter are always ignored by the parser.
191
192 All of these symbols are stored in a simple symbol table.  We use the
193 `struct text` from `mdcode` to store the name and link them together
194 into a sorted list using an insertion sort.
195
196 We don't have separate `find` and `insert` functions as any symbol we
197 find needs to be remembered.  We simply expect `find` to always return a
198 symbol, but its type might be `Unknown`.
199
200 ###### includes
201         #include <string.h>
202
203 ###### symbol fields
204         struct text name;
205         struct symbol *next;
206
207 ###### grammar fields
208         struct symbol *syms;
209         int num_syms;
210
211 ###### functions
212         static struct symbol *sym_find(struct grammar *g, struct text s)
213         {
214                 struct symbol **l = &g->syms;
215                 struct symbol *n;
216                 int cmp = 1;
217
218                 while (*l &&
219                         (cmp = text_cmp((*l)->name, s)) < 0)
220                                 l = & (*l)->next;
221                 if (cmp == 0)
222                         return *l;
223                 n = calloc(1, sizeof(*n));
224                 n->name = s;
225                 n->type = Unknown;
226                 n->next = *l;
227                 n->num = -1;
228                 *l = n;
229                 return n;
230         }
231
232         static void symbols_init(struct grammar *g)
233         {
234                 int entries = sizeof(reserved_words)/sizeof(reserved_words[0]);
235                 int i;
236                 for (i = 0; i < entries; i++) {
237                         struct text t;
238                         struct symbol *s;
239                         t.txt = reserved_words[i].name;
240                         t.len = strlen(t.txt);
241                         s = sym_find(g, t);
242                         s->type = Terminal;
243                         s->num = reserved_words[i].num;
244                 }
245         }
246
247 ### Data types and precedence.
248
249 Data type specification, precedence specification, and declaration of
250 terminals are all introduced by a dollar sign at the start of the line.
251 If the next word is `LEFT`, `RIGHT` or `NON`, then the line specifies a
252 precedence, if it is `TERM` the the line declares terminals without
253 precedence, otherwise it specifies a data type.
254
255 The data type name is simply stored and applied to the head of all
256 subsequent productions.  It must be the name of a structure optionally
257 preceded by an asterisk which means a reference or "pointer".  So
258 `$expression` maps to `struct expression` and `$*statement` maps to
259 `struct statement *`.
260
261 Any productions given before the first data type declaration will have
262 no data type associated with them and can carry no information.  In
263 order to allow other non-terminals to have no type, the data type
264 `$void` can be given.  This does *not* mean that `struct void` will be
265 used, but rather than no type will be associated with future
266 non-terminals.
267
268 The precedence line must contain a list of symbols - typically
269 terminal symbols, but not necessarily.  It can only contain symbols
270 that have not been seen yet, so precedence declaration must precede
271 the productions that they affect.
272
273 A precedence line may also contain a "virtual" symbol which is an
274 identifier preceded by `$$`.  Virtual terminals carry precedence
275 information but are not included in the grammar.  A production can
276 declare that it inherits the precedence of a given virtual symbol.
277
278 This use for `$$` precludes it from being used as a symbol in the
279 described language.  Two other symbols: `${` and `}$` are also
280 unavailable.
281
282 Each new precedence line introduces a new precedence level and
283 declares how it associates.  This level is stored in each symbol
284 listed and may be inherited by any production which uses the symbol.  A
285 production inherits from the last symbol which has a precedence.
286
287 The symbols on the first precedence line have the lowest precedence.
288 Subsequent lines introduce symbols with higher precedence.
289
290 ###### grammar fields
291         struct text current_type;
292         int type_isref;
293         int prec_levels;
294
295 ###### declarations
296         enum symbols { TK_virtual = TK_reserved, TK_open, TK_close };
297         static const char *known[] = { "$$", "${", "}$" };
298
299 ###### functions
300         static char *dollar_line(struct token_state *ts, struct grammar *g, int isref)
301         {
302                 struct token t = token_next(ts);
303                 char *err;
304                 enum assoc assoc;
305                 int term = 0;
306                 int found;
307
308                 if (t.num != TK_ident) {
309                         err = "type or assoc expected after '$'";
310                         goto abort;
311                 }
312                 if (text_is(t.txt, "LEFT"))
313                         assoc = Left;
314                 else if (text_is(t.txt, "RIGHT"))
315                         assoc = Right;
316                 else if (text_is(t.txt, "NON"))
317                         assoc = Non;
318                 else if (text_is(t.txt, "TERM")) {
319                         term = 1;
320                         g->terminals_declared = 1;
321                 } else {
322                         g->current_type = t.txt;
323                         g->type_isref = isref;
324                         if (text_is(t.txt, "void"))
325                                 g->current_type.txt = NULL;
326                         t = token_next(ts);
327                         if (t.num != TK_newline) {
328                                 err = "Extra tokens after type name";
329                                 goto abort;
330                         }
331                         return NULL;
332                 }
333
334                 if (isref) {
335                         err = "$* cannot be followed by a precedence";
336                         goto abort;
337                 }
338
339                 // This is a precedence or TERM line, need some symbols.
340                 found = 0;
341                 g->prec_levels += 1;
342                 t = token_next(ts);
343                 while (t.num != TK_newline) {
344                         enum symtype type = Terminal;
345                         struct symbol *s;
346                         if (t.num == TK_virtual) {
347                                 type = Virtual;
348                                 t = token_next(ts);
349                                 if (t.num != TK_ident) {
350                                         err = "$$ must be followed by a word";
351                                         goto abort;
352                                 }
353                                 if (term) {
354                                         err = "Virtual symbols not permitted on $TERM line";
355                                         goto abort;
356                                 }
357                         } else if (t.num != TK_ident &&
358                                    t.num != TK_mark) {
359                                 err = "Illegal token in precedence line";
360                                 goto abort;
361                         }
362                         s = sym_find(g, t.txt);
363                         if (s->type != Unknown) {
364                                 err = "Symbols in precedence/TERM line must not already be known.";
365                                 goto abort;
366                         }
367                         s->type = type;
368                         if (!term) {
369                                 s->precedence = g->prec_levels;
370                                 s->assoc = assoc;
371                         }
372                         found += 1;
373                         t = token_next(ts);
374                 }
375                 if (found == 0)
376                         err = "No symbols given on precedence/TERM line";
377                         goto abort;
378                 return NULL;
379         abort:
380                 while (t.num != TK_newline && t.num != TK_eof)
381                         t = token_next(ts);
382                 return err;
383         }
384
385 ### Productions
386
387 A production either starts with an identifier which is the head
388 non-terminal, or a vertical bar (`|`) in which case this production
389 uses the same head as the previous one.  The identifier must be
390 followed by a `->` mark.  All productions for a given non-terminal must
391 be grouped together with the `nonterminal ->` given only once.
392
393 After this a (possibly empty) sequence of identifiers and marks form
394 the body of the production.  A virtual symbol may be given after the
395 body by preceding it with `$$`.  If a virtual symbol is given, the
396 precedence of the production is that for the virtual symbol.  If none
397 is given, the precedence is inherited from the last symbol in the
398 production which has a precedence specified.
399
400 After the optional precedence may come the `${` mark.  This indicates
401 the start of a code fragment.  If present, this must be on the same
402 line as the start of the production.
403
404 All of the text from the `${` through to the matching `}$` is
405 collected and forms the code-fragment for the production.  It must all
406 be in one `code_node` of the literate code.  The `}$` must be
407 at the end of a line.
408
409 Text in the code fragment will undergo substitutions where `$N` or
410 `$<N`,for some numeric `N` (or non-numeric indicator as described
411 later), will be replaced with a variable holding the parse information
412 for the particular symbol in the production.  `$0` is the head of the
413 production, `$1` is the first symbol of the body, etc.  The type of `$N`
414 for a terminal symbol is `struct token`.  For a non-terminal, it is
415 whatever has been declared for that symbol.  The `<` may be included and
416 means that the value (usually a reference) is being moved out, so it
417 will not automatically be freed.  The effect of using '<' is that the
418 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 dot)
1171         {
1172                 return production | ((31-dot) << 11);
1173         }
1174         static inline int item_prod(unsigned short item)
1175         {
1176                 return item & 0x7ff;
1177         }
1178         static inline int item_dot(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_dot(a.syms[i]) > 0 &&
1197                      item_dot(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_dot(a.syms[i]) == 0)
1209                         av = -1;
1210                 else
1211                         av = a.syms[i];
1212                 if (i == b.cnt || item_dot(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_dot(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_dot(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_dot(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_dot(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_dot(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_dot(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_dot(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 Instead of a number `N`, the `$` or `$<` can be followed by some letters
2180 and possibly a number.  A number by itself (other than zero) selects a
2181 symbol from the body of the production.  A sequence of letters selects
2182 the shortest symbol in the body which contains those letters in the given
2183 order.  If a number follows the letters, then a later occurrence of
2184 that symbol is chosen.  So "`$AB2`" will refer to the structure attached
2185 to the second occurrence of the shortest symbol which contains an `A`
2186 followed by a `B`.  If there is no unique shortest system, or if the
2187 number given is too large, then the symbol reference is not transformed,
2188 and will cause an error when the code is compiled.
2189
2190 ###### functions
2191
2192         static int textchr(struct text t, char c, int s)
2193         {
2194                 int i;
2195                 for (i = s; i < t.len; i++)
2196                         if (t.txt[i] == c)
2197                                 return i;
2198                 return -1;
2199         }
2200
2201         static int subseq_match(char *seq, int slen, struct text name)
2202         {
2203                 int st = 0;
2204                 while (slen > 0) {
2205                         st = textchr(name, *seq, st);
2206                         if (st < 0)
2207                                 return 0;
2208                         slen -= 1;
2209                         seq += 1;
2210                         st += 1;
2211                 }
2212                 return 1;
2213         }
2214
2215         static int choose_sym(char **namep, int len, struct production *p)
2216         {
2217                 char *name = *namep;
2218                 char *nam = name;
2219                 int namlen;
2220                 int n = 0;
2221                 int i, s, slen;
2222                 char c;
2223
2224                 c = *name;
2225                 while (len > 0 &&
2226                        ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))) {
2227                         name += 1;
2228                         len -= 1;
2229                         c = *name;
2230                 }
2231                 namlen = name-nam;
2232                 while (len > 0 && (c >= '0' && c <= '9')) {
2233                         name += 1;
2234                         len -= 1;
2235                         n = n * 10 + (c - '0');
2236                         c = *name;
2237                 }
2238                 if (namlen == 0) {
2239                         if (name == *namep)
2240                                 return -1;
2241                         *namep = name;
2242                         return n;
2243                 }
2244                 slen = 0; s = -1;
2245                 for (i = 0; i < p->body_size; i++) {
2246                         if (!subseq_match(nam, namlen, p->body[i]->name))
2247                                 continue;
2248                         if (slen == 0 || p->body[i]->name.len < slen)
2249                                 s = i;
2250                         if (s >= 0 && p->body[i] != p->body[s] &&
2251                             p->body[i]->name.len == p->body[s]->name.len)
2252                                 /* not unique, so s cannot be used */
2253                                 s = -1;
2254                 }
2255                 if (s < 0)
2256                         return -1;
2257                 if (n == 0);
2258                         n = 1;
2259                 for (i = 0; i < p->body_size; i++)
2260                         if (p->body[i] == p->body[s]) {
2261                                 n -= 1;
2262                                 if (n == 0)
2263                                         break;
2264                         }
2265                 if (n > 1)
2266                         return -1;
2267                 *namep = name;
2268                 return i + 1;
2269         }
2270
2271         static void gen_code(struct production *p, FILE *f, struct grammar *g)
2272         {
2273                 char *c;
2274                 char *used = calloc(1, p->body_size);
2275                 int i;
2276
2277                 fprintf(f, "\t\t\t");
2278                 for (c = p->code.txt; c < p->code.txt + p->code.len; c++) {
2279                         int n;
2280                         int use = 0;
2281                         if (*c != '$') {
2282                                 fputc(*c, f);
2283                                 if (*c == '\n')
2284                                         fputs("\t\t\t", f);
2285                                 continue;
2286                         }
2287                         c++;
2288                         if (*c == '<') {
2289                                 use = 1;
2290                                 c++;
2291                         }
2292                         n = choose_sym(&c, p->code.txt + p->code.len - c, p);
2293                         if (n < 0) {
2294                                 fputc('$', f);
2295                                 if (use)
2296                                         fputc('<', f);
2297                                 fputc(*c, f);
2298                                 continue;
2299                         }
2300                         if (n == 0)
2301                                 fprintf(f, "(*(struct %.*s*%s)ret)",
2302                                         p->head->struct_name.len,
2303                                         p->head->struct_name.txt,
2304                                         p->head->isref ? "*":"");
2305                         else if (p->body[n-1]->type == Terminal)
2306                                 fprintf(f, "(*(struct token *)body[%d])",
2307                                         n-1);
2308                         else if (p->body[n-1]->struct_name.txt == NULL)
2309                                 fprintf(f, "$%d", n);
2310                         else {
2311                                 fprintf(f, "(*(struct %.*s*%s)body[%d])",
2312                                         p->body[n-1]->struct_name.len,
2313                                         p->body[n-1]->struct_name.txt,
2314                                         p->body[n-1]->isref ? "*":"", n-1);
2315                                 used[n-1] = use;
2316                         }
2317                         c -= 1;
2318                 }
2319                 fputs("\n", f);
2320                 for (i = 0; i < p->body_size; i++) {
2321                         if (p->body[i]->struct_name.txt &&
2322                             used[i]) {
2323                                 // assume this has been copied out
2324                                 if (p->body[i]->isref)
2325                                         fprintf(f, "\t\t*(void**)body[%d] = NULL;\n", i);
2326                                 else
2327                                         fprintf(f, "\t\tmemset(body[%d], 0, sizeof(struct %.*s));\n", i, p->body[i]->struct_name.len, p->body[i]->struct_name.txt);
2328                         }
2329                 }
2330                 free(used);
2331         }
2332
2333 ###### functions
2334
2335         static void gen_reduce(FILE *f, struct grammar *g, char *file,
2336                                struct code_node *code)
2337         {
2338                 int i;
2339                 fprintf(f, "#line 1 \"gen_reduce\"\n");
2340                 fprintf(f, "static int do_reduce(int prod, void **body, struct token_config *config, void *ret)\n");
2341                 fprintf(f, "{\n");
2342                 fprintf(f, "\tint ret_size = 0;\n");
2343                 if (code)
2344                         code_node_print(f, code, file);
2345
2346                 fprintf(f, "#line 4 \"gen_reduce\"\n");
2347                 fprintf(f, "\tswitch(prod) {\n");
2348                 for (i = 0; i < g->production_count; i++) {
2349                         struct production *p = g->productions[i];
2350                         fprintf(f, "\tcase %d:\n", i);
2351
2352                         if (p->code.txt) {
2353                                 fprintf(f, "#line %d \"%s\"\n", p->code_line, file);
2354                                 gen_code(p, f, g);
2355                         }
2356
2357                         if (p->head->struct_name.txt)
2358                                 fprintf(f, "\t\tret_size = sizeof(struct %.*s%s);\n",
2359                                         p->head->struct_name.len,
2360                                         p->head->struct_name.txt,
2361                                         p->head->isref ? "*":"");
2362
2363                         fprintf(f, "\t\tbreak;\n");
2364                 }
2365                 fprintf(f, "\t}\n\treturn ret_size;\n}\n\n");
2366         }
2367
2368 ### `do_free`
2369
2370 As each non-terminal can potentially cause a different type of data
2371 structure to be allocated and filled in, we need to be able to free it when
2372 done.
2373
2374 It is particularly important to have fine control over freeing during error
2375 recovery where individual stack frames might need to be freed.
2376
2377 For this, the grammar author is required to defined a `free_XX` function for
2378 each structure that is used by a non-terminal.  `do_free` will call whichever
2379 is appropriate given a symbol number, and will call `free` (as is
2380 appropriate for tokens) on any terminal symbol.
2381
2382 ###### functions
2383
2384         static void gen_free(FILE *f, struct grammar *g)
2385         {
2386                 int i;
2387
2388                 fprintf(f, "#line 0 \"gen_free\"\n");
2389                 fprintf(f, "static void do_free(short sym, void *asn)\n");
2390                 fprintf(f, "{\n");
2391                 fprintf(f, "\tif (!asn) return;\n");
2392                 fprintf(f, "\tif (sym < %d) {\n", g->first_nonterm);
2393                 fprintf(f, "\t\tfree(asn);\n\t\treturn;\n\t}\n");
2394                 fprintf(f, "\tswitch(sym) {\n");
2395
2396                 for (i = 0; i < g->num_syms; i++) {
2397                         struct symbol *s = g->symtab[i];
2398                         if (!s ||
2399                             s->type != Nonterminal ||
2400                             s->struct_name.txt == NULL)
2401                                 continue;
2402
2403                         fprintf(f, "\tcase %d:\n", s->num);
2404                         if (s->isref) {
2405                                 fprintf(f, "\t\tfree_%.*s(*(void**)asn);\n",
2406                                         s->struct_name.len,
2407                                         s->struct_name.txt);
2408                                 fprintf(f, "\t\tfree(asn);\n");
2409                         } else
2410                                 fprintf(f, "\t\tfree_%.*s(asn);\n",
2411                                         s->struct_name.len,
2412                                         s->struct_name.txt);
2413                         fprintf(f, "\t\tbreak;\n");
2414                 }
2415                 fprintf(f, "\t}\n}\n\n");
2416         }
2417
2418 ## The main routine.
2419
2420 There are three key parts to the "main" function of parsergen: processing
2421 the arguments, loading the grammar file, and dealing with the grammar.
2422
2423 ### Argument processing.
2424
2425 Command line options allow the selection of analysis mode, name of output
2426 file, and whether or not a report should be generated.  By default we create
2427 a report only if no code output was requested.
2428
2429 The `parse_XX` function name uses the basename of the output file which
2430 should not have a suffix (`.c`).  `.c` is added to the given name for the
2431 code, and `.h` is added for the header (if header text is specifed in the
2432 grammar file).
2433
2434 ###### includes
2435         #include <getopt.h>
2436
2437 ###### declarations
2438         static const struct option long_options[] = {
2439                 { "LR0",        0, NULL, '0' },
2440                 { "LR05",       0, NULL, '5' },
2441                 { "SLR",        0, NULL, 'S' },
2442                 { "LALR",       0, NULL, 'L' },
2443                 { "LR1",        0, NULL, '1' },
2444                 { "tag",        1, NULL, 't' },
2445                 { "report",     0, NULL, 'R' },
2446                 { "output",     1, NULL, 'o' },
2447                 { NULL,         0, NULL, 0   }
2448         };
2449         const char *options = "05SL1t:Ro:";
2450
2451 ###### process arguments
2452         int opt;
2453         char *outfile = NULL;
2454         char *infile;
2455         char *name;
2456         char *tag = NULL;
2457         int report = 1;
2458         enum grammar_type type = LR05;
2459         while ((opt = getopt_long(argc, argv, options,
2460                                   long_options, NULL)) != -1) {
2461                 switch(opt) {
2462                 case '0':
2463                         type = LR0; break;
2464                 case '5':
2465                         type = LR05; break;
2466                 case 'S':
2467                         type = SLR; break;
2468                 case 'L':
2469                         type = LALR; break;
2470                 case '1':
2471                         type = LR1; break;
2472                 case 'R':
2473                         report = 2; break;
2474                 case 'o':
2475                         outfile = optarg; break;
2476                 case 't':
2477                         tag = optarg; break;
2478                 default:
2479                         fprintf(stderr, "Usage: parsergen ...\n");
2480                         exit(1);
2481                 }
2482         }
2483         if (optind < argc)
2484                 infile = argv[optind++];
2485         else {
2486                 fprintf(stderr, "No input file given\n");
2487                 exit(1);
2488         }
2489         if (outfile && report == 1)
2490                 report = 0;
2491         name = outfile;
2492         if (name && strchr(name, '/'))
2493                 name = strrchr(name, '/')+1;
2494
2495         if (optind < argc) {
2496                 fprintf(stderr, "Excess command line arguments\n");
2497                 exit(1);
2498         }
2499
2500 ### Loading the grammar file
2501
2502 To be able to run `mdcode` and `scanner` on the grammar we need to memory
2503 map it.
2504
2505 Once we have extracted the code (with `mdcode`) we expect to find three
2506 sections: header, code, and grammar.  Anything else that is not
2507 excluded by the `--tag` option is an error.
2508
2509 "header" and "code" are optional, though it is hard to build a working
2510 parser with neither. "grammar" must be provided.
2511
2512 ###### includes
2513         #include <fcntl.h>
2514         #include <sys/mman.h>
2515         #include <errno.h>
2516
2517 ###### functions
2518         static int errs;
2519         static void pr_err(char *msg)
2520         {
2521                 errs++;
2522                 fprintf(stderr, "%s\n", msg);
2523         }
2524
2525 ###### load file
2526         struct section *table;
2527         int fd;
2528         int len;
2529         char *file;
2530         fd = open(infile, O_RDONLY);
2531         if (fd < 0) {
2532                 fprintf(stderr, "parsergen: cannot open %s: %s\n",
2533                         infile, strerror(errno));
2534                 exit(1);
2535         }
2536         len = lseek(fd, 0, 2);
2537         file = mmap(NULL, len, PROT_READ, MAP_SHARED, fd, 0);
2538         table = code_extract(file, file+len, pr_err);
2539
2540         struct code_node *hdr = NULL;
2541         struct code_node *code = NULL;
2542         struct code_node *gram = NULL;
2543         struct code_node *pre_reduce = NULL;
2544         for (s = table; s; s = s->next) {
2545                 struct text sec = s->section;
2546                 if (tag && !strip_tag(&sec, tag))
2547                         continue;
2548                 if (text_is(sec, "header"))
2549                         hdr = s->code;
2550                 else if (text_is(sec, "code"))
2551                         code = s->code;
2552                 else if (text_is(sec, "grammar"))
2553                         gram = s->code;
2554                 else if (text_is(sec, "reduce"))
2555                         pre_reduce = s->code;
2556                 else {
2557                         fprintf(stderr, "Unknown content section: %.*s\n",
2558                                 s->section.len, s->section.txt);
2559                         rv |= 2;
2560                 }
2561         }
2562
2563 ### Processing the input
2564
2565 As we need to append an extention to a filename and then open it for
2566 writing, and we need to do this twice, it helps to have a separate function.
2567
2568 ###### functions
2569
2570         static FILE *open_ext(char *base, char *ext)
2571         {
2572                 char *fn = malloc(strlen(base) + strlen(ext) + 1);
2573                 FILE *f;
2574                 strcat(strcpy(fn, base), ext);
2575                 f = fopen(fn, "w");
2576                 free(fn);
2577                 return f;
2578         }
2579
2580 If we can read the grammar, then we analyse and optionally report on it.  If
2581 the report finds conflicts we will exit with an error status.
2582
2583 ###### process input
2584         struct grammar *g = NULL;
2585         if (gram == NULL) {
2586                 fprintf(stderr, "No grammar section provided\n");
2587                 rv |= 2;
2588         } else {
2589                 g = grammar_read(gram);
2590                 if (!g) {
2591                         fprintf(stderr, "Failure to parse grammar\n");
2592                         rv |= 2;
2593                 }
2594         }
2595         if (g) {
2596                 grammar_analyse(g, type);
2597                 if (report)
2598                         if (grammar_report(g, type))
2599                                 rv |= 1;
2600         }
2601
2602 If a "headers" section is defined, we write it out and include a declaration
2603 for the `parse_XX` function so it can be used from separate code.
2604
2605         if (rv == 0 && hdr && outfile) {
2606                 FILE *f = open_ext(outfile, ".h");
2607                 if (f) {
2608                         code_node_print(f, hdr, infile);
2609                         fprintf(f, "void *parse_%s(struct code_node *code, struct token_config *config, FILE *trace);\n",
2610                                 name);
2611                         fclose(f);
2612                 } else {
2613                         fprintf(stderr, "Cannot create %s.h\n",
2614                                 outfile);
2615                         rv |= 4;
2616                 }
2617         }
2618
2619 And if all goes well and an output file was provided, we create the `.c`
2620 file with the code section (if any) and the parser tables and function.
2621
2622         if (rv == 0 && outfile) {
2623                 FILE *f = open_ext(outfile, ".c");
2624                 if (f) {
2625                         if (code)
2626                                 code_node_print(f, code, infile);
2627                         gen_parser(f, g, infile, name, pre_reduce);
2628                         fclose(f);
2629                 } else {
2630                         fprintf(stderr, "Cannot create %s.c\n",
2631                                 outfile);
2632                         rv |= 4;
2633                 }
2634         }
2635
2636 And that about wraps it up.  We need to set the locale so that UTF-8 is
2637 recognised properly, and link with `libicuuc` as `libmdcode` requires that.
2638
2639 ###### File: parsergen.mk
2640         parsergen : parsergen.o libscanner.o libmdcode.o
2641                 $(CC) $(CFLAGS) -o parsergen parsergen.o libscanner.o libmdcode.o -licuuc
2642
2643 ###### includes
2644         #include <locale.h>
2645
2646 ###### main
2647
2648         int main(int argc, char *argv[])
2649         {
2650                 struct section *s;
2651                 int rv = 0;
2652
2653                 setlocale(LC_ALL,"");
2654
2655                 ## process arguments
2656                 ## load file
2657                 ## process input
2658
2659                 return rv;
2660         }
2661
2662 ## The SHIFT/REDUCE parser
2663
2664 Having analysed the grammar and generated all the tables, we only need the
2665 shift/reduce engine to bring it all together.
2666
2667 ### Goto table lookup
2668
2669 The parser generator has nicely provided us with goto tables sorted by
2670 symbol number.  We need a binary search function to find a symbol in the
2671 table.
2672
2673 ###### parser functions
2674
2675         static int search(const struct state *l, int sym)
2676         {
2677                 int lo = 0;
2678                 int hi = l->go_to_cnt;
2679
2680                 if (hi == 0)
2681                         return -1;
2682                 while (lo + 1 < hi) {
2683                         int mid = (lo + hi) / 2;
2684                         if (l->go_to[mid].sym <= sym)
2685                                 lo = mid;
2686                         else
2687                                 hi = mid;
2688                 }
2689                 if (l->go_to[lo].sym == sym)
2690                         return l->go_to[lo].state;
2691                 else
2692                         return -1;
2693         }
2694
2695 ### The state stack.
2696
2697 The core data structure for the parser is the stack.  This tracks all the
2698 symbols that have been recognised or partially recognised.
2699
2700 The stack usually won't grow very large - maybe a few tens of entries.  So
2701 we dynamically resize and array as required but never bother to shrink it
2702 down again.
2703
2704 We keep the stack as two separate allocations.  One, `asn_stack` stores the
2705 "abstract syntax nodes" which are created by each reduction.  When we call
2706 `do_reduce` we need to pass an array of the `asn`s of the body of the
2707 production, and by keeping a separate `asn` stack, we can just pass a
2708 pointer into this stack.
2709
2710 The other allocation stores all other stack fields of which there are six.
2711 The `state` is the most important one and guides the parsing process.  The
2712 `sym` is nearly unnecessary.  However when we want to free entries from the
2713 `asn_stack`, it helps to know what type they are so we can call the right
2714 freeing function.  The symbol leads us to the right free function through
2715 `do_free`.
2716
2717 The `indents` count tracks the line indents with-in the symbol or
2718 immediately follow it.  These are used to allow indent information to
2719 guide parsing and error recovery.
2720
2721 `since_newline` tracks how many stack frames since the last
2722 start-of-line (whether indented or not).  So if `since_newline` is
2723 zero, then this symbol is at the start of a line.  Similarly
2724 `since_indent` counts the number of states since an indent, it is zero
2725 precisely when `indents` is not zero.
2726
2727 `newline_permitted` keeps track of whether newlines should be ignored
2728 or not.
2729
2730 The stack is most properly seen as alternating states and symbols -
2731 states, like the 'DOT' in items, are between symbols.  Each frame in
2732 our stack holds a state and the symbol that was before it.  The
2733 bottom of stack holds the start state but no symbol, as nothing came
2734 before the beginning.
2735
2736 ###### parser functions
2737
2738         struct parser {
2739                 struct frame {
2740                         short state;
2741                         short newline_permitted;
2742
2743                         short sym;
2744                         short indents;
2745                         short since_newline;
2746                         short since_indent;
2747                 } *stack;
2748                 void **asn_stack;
2749                 int stack_size;
2750                 int tos;
2751         };
2752
2753 #### Shift and pop
2754
2755 Two operations are needed on the stack - shift (which is like push) and pop.
2756
2757 Shift applies not only to terminals but also to non-terminals.  When
2758 we reduce a production we will pop off entries corresponding to the
2759 body symbols, then push on an item for the head of the production.
2760 This last is exactly the same process as shifting in a terminal so we
2761 use the same function for both.  In both cases we provide the symbol,
2762 the number of indents the symbol contains (which will be zero for a
2763 terminal symbol) and a flag indicating the the symbol was at (or was
2764 reduced from a symbol which was at) the start of a line.  The state is
2765 deduced from the current top-of-stack state and the new symbol.
2766
2767 To simplify other code we arrange for `shift` to fail if there is no `goto`
2768 state for the symbol.  This is useful in basic parsing due to our design
2769 that we shift when we can, and reduce when we cannot.  So the `shift`
2770 function reports if it could.
2771
2772 `shift` is also used to push state zero onto the stack, so if the
2773 stack is empty, it always chooses zero as the next state.
2774
2775 So `shift` finds the next state.  If that succeeds it extends the
2776 allocations if needed and pushes all the information onto the stacks.
2777
2778 Newlines are permitted after a `starts_line` state until an internal
2779 indent.  If the new frame has neither a `starts_line` state nor an
2780 indent, newlines are permitted if the previous stack frame permitted
2781 them.
2782
2783 ###### parser functions
2784
2785         static int shift(struct parser *p,
2786                          short sym, short indents, short start_of_line,
2787                          void *asn,
2788                          const struct state states[])
2789         {
2790                 // Push an entry onto the stack
2791                 struct frame next = {0};
2792                 int newstate = p->tos
2793                         ? search(&states[p->stack[p->tos-1].state],
2794                                  sym)
2795                         : 0;
2796                 if (newstate < 0)
2797                         return 0;
2798                 if (p->tos >= p->stack_size) {
2799                         p->stack_size += 10;
2800                         p->stack = realloc(p->stack, p->stack_size
2801                                            * sizeof(p->stack[0]));
2802                         p->asn_stack = realloc(p->asn_stack, p->stack_size
2803                                            * sizeof(p->asn_stack[0]));
2804                 }
2805                 next.sym = sym;
2806                 next.indents = indents;
2807                 next.state = newstate;
2808                 if (states[newstate].starts_line)
2809                         next.newline_permitted = 1;
2810                 else if (indents)
2811                         next.newline_permitted = 0;
2812                 else if (p->tos)
2813                         next.newline_permitted =
2814                                 p->stack[p->tos-1].newline_permitted;
2815                 else
2816                         next.newline_permitted = 0;
2817
2818                 if (!start_of_line) {
2819                         if (p->tos)
2820                                 next.since_newline = p->stack[p->tos-1].since_newline + 1;
2821                         else
2822                                 next.since_newline = 1;
2823                 }
2824                 if (indents)
2825                         next.since_indent = 0;
2826                 else if (p->tos)
2827                         next.since_indent = p->stack[p->tos-1].since_indent + 1;
2828                 else
2829                         next.since_indent = 1;
2830
2831                 p->stack[p->tos] = next;
2832                 p->asn_stack[p->tos] = asn;
2833                 p->tos++;
2834                 return 1;
2835         }
2836
2837 `pop` primarily moves the top of stack (`tos`) back down the required
2838 amount and frees any `asn` entries that need to be freed.  It also
2839 collects a summary of the indents and line starts in the symbols that
2840 are being removed. It is called _after_ we reduce a production, just
2841 before we `shift` the nonterminal in.
2842
2843 ###### parser functions
2844
2845         static int pop(struct parser *p, int num,
2846                        short *start_of_line,
2847                        void(*do_free)(short sym, void *asn))
2848         {
2849                 int i;
2850                 short indents = 0;
2851                 int sol = 0;
2852
2853                 p->tos -= num;
2854                 for (i = 0; i < num; i++) {
2855                         sol |= !p->stack[p->tos+i].since_newline;
2856                         indents += p->stack[p->tos+i].indents;
2857                         do_free(p->stack[p->tos+i].sym,
2858                                 p->asn_stack[p->tos+i]);
2859                 }
2860                 if (start_of_line)
2861                         *start_of_line = sol;
2862                 return indents;
2863         }
2864
2865 ### Memory allocation
2866
2867 The `scanner` returns tokens in a local variable - we want them in allocated
2868 memory so they can live in the `asn_stack`.  Similarly the `asn` produced by
2869 a reduce is in a large buffer.  Both of these require some allocation and
2870 copying, hence `memdup` and `tokcopy`.
2871
2872 ###### parser includes
2873         #include <memory.h>
2874
2875 ###### parser functions
2876
2877         void *memdup(void *m, int len)
2878         {
2879                 void *ret;
2880                 if (len == 0)
2881                         return NULL;
2882                 ret = malloc(len);
2883                 memcpy(ret, m, len);
2884                 return ret;
2885         }
2886
2887         static struct token *tok_copy(struct token tk)
2888         {
2889                 struct token *new = malloc(sizeof(*new));
2890                 *new = tk;
2891                 return new;
2892         }
2893
2894 ### The heart of the parser.
2895
2896 Now we have the parser.  If we can shift we do, though newlines and
2897 reducing indenting may block that.  If not and we can reduce we do
2898 that.  If the production we reduced was production zero, then we have
2899 accepted the input and can finish.
2900
2901 We return whatever `asn` was returned by reducing production zero.
2902
2903 If we can neither shift nor reduce we have an error to handle.  We pop
2904 single entries off the stack until we can shift the `TK_error` symbol,
2905 then drop input tokens until we find one we can shift into the new error
2906 state.  We need to ensure that something is dropped or shifted after an
2907 error, or we could get into an infinite loop, only shifting in
2908 `TK_error`, then reducing.  So we track if there has been a shift since
2909 the last error, and if not the next error always discards one token.
2910
2911 When we find `TK_in` and `TK_out` tokens which report indents we need
2912 to handle them directly as the grammar cannot express what we want to
2913 do with them.
2914
2915 `TK_in` tokens are easy: we simply update indent count in the top stack frame to
2916 record how many indents there are following the previous token.
2917
2918 `TK_out` tokens must be canceled against an indent count
2919 within the stack.  If we can reduce some symbols that are all since
2920 the most recent indent, then we do that first.  If the minimum prefix
2921 of the current state then extends back before the most recent indent,
2922 that indent can be cancelled.  If the minimum prefix is shorter then
2923 the indent had ended prematurely and we must start error handling, which
2924 is still a work-in-progress.
2925
2926 `TK_newline` tokens are ignored unless the top stack frame records
2927 that they are permitted.  In that case they will not be considered for
2928 shifting if it is possible to reduce some symbols that are all since
2929 the most recent start of line.  This is how a newline forcibly
2930 terminates any line-like structure - we try to reduce down to at most
2931 one symbol for each line where newlines are allowed.
2932 A consequence of this is that a rule like
2933
2934 ###### Example: newlines - broken
2935
2936         Newlines ->
2937                 | NEWLINE Newlines
2938         IfStatement -> Newlines if ....
2939
2940 cannot work, as the NEWLINE will never be shifted as the empty string
2941 will be reduced first.  Optional sets of newlines need to be include
2942 in the thing that preceed:
2943
2944 ###### Example: newlines - works
2945
2946         If -> if
2947                 | NEWLINE If
2948         IfStatement -> If ....
2949
2950 Here the NEWLINE will be shifted because nothing can be reduced until
2951 the `if` is seen.
2952
2953 When during error handling we discard tokens read in, we want to keep
2954 discarding until we see one that is recognised.  If we had a full set
2955 of LR(1) grammar states, this would mean looking in the look-ahead set,
2956 but we don't keep a full look-ahead set.  We only record the subset
2957 that leads to SHIFT.  We can, however, deduce the look-ahead set by
2958 looking at the SHIFT subsets for all states that we can get to by
2959 reducing zero or more times.  So we need a little function which
2960 checks if a given token is in any of these look-ahead sets.
2961
2962 ###### parser includes
2963         #include "parser.h"
2964
2965 ###### parser_run
2966
2967         static int in_lookahead(struct token *tk, const struct state *states, int state)
2968         {
2969                 while (state >= 0) {
2970                         if (search(&states[state], tk->num) >= 0)
2971                                 return 1;
2972                         if (states[state].reduce_prod < 0)
2973                                 return 0;
2974                         state = search(&states[state], states[state].reduce_sym);
2975                 }
2976                 return 0;
2977         }
2978
2979         void *parser_run(struct token_state *tokens,
2980                          const struct state states[],
2981                          int (*do_reduce)(int, void**, struct token_config*, void*),
2982                          void (*do_free)(short, void*),
2983                          FILE *trace, const char *non_term[],
2984                          struct token_config *config)
2985         {
2986                 struct parser p = { 0 };
2987                 struct token *tk = NULL;
2988                 int accepted = 0;
2989                 int shift_since_err = 1;
2990                 void *ret = NULL;
2991
2992                 shift(&p, TK_eof, 0, 1, NULL, states);
2993                 while (!accepted && p.tos > 0) {
2994                         struct token *err_tk;
2995                         struct frame *tos = &p.stack[p.tos-1];
2996                         if (!tk)
2997                                 tk = tok_copy(token_next(tokens));
2998                         parser_trace(trace, &p,
2999                                      tk, states, non_term, config->known_count);
3000
3001                         if (tk->num == TK_in) {
3002                                 tos->indents += 1;
3003                                 tos->since_newline = 0;
3004                                 tos->since_indent = 0;
3005                                 if (!states[tos->state].starts_line)
3006                                         tos->newline_permitted = 0;
3007                                 free(tk);
3008                                 tk = NULL;
3009                                 parser_trace_action(trace, "Record");
3010                                 continue;
3011                         }
3012                         if (tk->num == TK_out) {
3013                                 if (states[tos->state].reduce_size >= 0 &&
3014                                     states[tos->state].reduce_size <= tos->since_indent)
3015                                         goto force_reduce;
3016                                 if (states[tos->state].min_prefix >= tos->since_indent) {
3017                                         // OK to cancel
3018                                         struct frame *in = tos - tos->since_indent;
3019                                         in->indents -= 1;
3020                                         if (in->indents == 0) {
3021                                                 /* Reassess since_indent and newline_permitted */
3022                                                 if (in > p.stack) {
3023                                                         in->since_indent = in[-1].since_indent + 1;
3024                                                         in->newline_permitted = in[-1].newline_permitted;
3025                                                 } else {
3026                                                         in->since_indent = 0;
3027                                                         in->newline_permitted = 0;
3028                                                 }
3029                                                 if (states[in->state].starts_line)
3030                                                         in->newline_permitted = 1;
3031                                                 while (in < tos) {
3032                                                         in += 1;
3033                                                         in->since_indent = in[-1].since_indent + 1;
3034                                                         if (states[in->state].starts_line)
3035                                                                 in->newline_permitted = 1;
3036                                                         else
3037                                                                 in->newline_permitted = in[-1].newline_permitted;
3038                                                 }
3039                                         }
3040                                         free(tk);
3041                                         tk = NULL;
3042                                         parser_trace_action(trace, "Cancel");
3043                                         continue;
3044                                 }
3045                                 // fall through to error handling as both SHIFT and REDUCE
3046                                 // will fail.
3047                         }
3048                         if (tk->num == TK_newline) {
3049                                 if (!tos->newline_permitted) {
3050                                         free(tk);
3051                                         tk = NULL;
3052                                         parser_trace_action(trace, "Discard");
3053                                         continue;
3054                                 }
3055                                 if (tos->since_newline > 1 &&
3056                                     states[tos->state].reduce_size >= 0 &&
3057                                     states[tos->state].reduce_size <= tos->since_newline)
3058                                         goto force_reduce;
3059                         }
3060                         if (shift(&p, tk->num, 0, tk->num == TK_newline, tk, states)) {
3061                                 shift_since_err = 1;
3062                                 tk = NULL;
3063                                 parser_trace_action(trace, "Shift");
3064                                 continue;
3065                         }
3066                 force_reduce:
3067                         if (states[tos->state].reduce_prod >= 0 &&
3068                             states[tos->state].newline_only &&
3069                             !(tk->num == TK_newline ||
3070                               tk->num == TK_eof ||
3071                               tk->num == TK_out ||
3072                               (tos->indents == 0 && tos->since_newline == 0))) {
3073                                 /* Anything other than newline or out or eof
3074                                  * in an error unless we are already at start
3075                                  * of line, as this production must end at EOL.
3076                                  */
3077                         } else if (states[tos->state].reduce_prod >= 0) {
3078                                 void **body;
3079                                 void *res;
3080                                 const struct state *nextstate = &states[tos->state];
3081                                 int prod = nextstate->reduce_prod;
3082                                 int size = nextstate->reduce_size;
3083                                 int bufsize;
3084                                 static char buf[16*1024];
3085                                 short indents, start_of_line;
3086
3087                                 body = p.asn_stack + (p.tos - size);
3088
3089                                 bufsize = do_reduce(prod, body, config, buf);
3090
3091                                 indents = pop(&p, size, &start_of_line,
3092                                               do_free);
3093                                 res = memdup(buf, bufsize);
3094                                 memset(buf, 0, bufsize);
3095                                 if (!shift(&p, nextstate->reduce_sym,
3096                                            indents, start_of_line,
3097                                            res, states)) {
3098                                         if (prod != 0) abort();
3099                                         accepted = 1;
3100                                         ret = res;
3101                                 }
3102                                 parser_trace_action(trace, "Reduce");
3103                                 continue;
3104                         }
3105                         /* Error. We walk up the stack until we
3106                          * find a state which will accept TK_error.
3107                          * We then shift in TK_error and see what state
3108                          * that takes us too.
3109                          * Then we discard input tokens until
3110                          * we find one that is acceptable.
3111                          */
3112                         parser_trace_action(trace, "ERROR");
3113                         short indents = 0, start_of_line;
3114
3115                         err_tk = tok_copy(*tk);
3116                         while (p.tos > 0 &&
3117                                shift(&p, TK_error, 0, 0,
3118                                      err_tk, states) == 0)
3119                                 // discard this state
3120                                 indents += pop(&p, 1, &start_of_line, do_free);
3121                         if (p.tos == 0) {
3122                                 free(err_tk);
3123                                 // no state accepted TK_error
3124                                 break;
3125                         }
3126                         if (!shift_since_err) {
3127                                 /* must discard at least one token to avoid
3128                                  * infinite loop.
3129                                  */
3130                                 if (tk->num == TK_eof)
3131                                         break;
3132                                 free(tk);
3133                                 tk = tok_copy(token_next(tokens));
3134                         }
3135                         shift_since_err = 0;
3136                         tos = &p.stack[p.tos-1];
3137                         while (!in_lookahead(tk, states, tos->state) &&
3138                                tk->num != TK_eof) {
3139                                 free(tk);
3140                                 tk = tok_copy(token_next(tokens));
3141                                 shift_since_err = 1;
3142                                 if (tk->num == TK_in)
3143                                         indents += 1;
3144                                 if (tk->num == TK_out) {
3145                                         if (indents == 0)
3146                                                 break;
3147                                         indents -= 1;
3148                                         // FIXME update since_indent here
3149                                 }
3150                         }
3151                         tos->indents += indents;
3152                 }
3153                 free(tk);
3154                 pop(&p, p.tos, NULL, do_free);
3155                 free(p.asn_stack);
3156                 free(p.stack);
3157                 return ret;
3158         }
3159
3160 ###### exported functions
3161         void *parser_run(struct token_state *tokens,
3162                          const struct state states[],
3163                          int (*do_reduce)(int, void**, struct token_config*, void*),
3164                          void (*do_free)(short, void*),
3165                          FILE *trace, const char *non_term[],
3166                          struct token_config *config);
3167
3168 ### Tracing
3169
3170 Being able to visualize the parser in action can be invaluable when
3171 debugging the parser code, or trying to understand how the parse of a
3172 particular grammar progresses.  The stack contains all the important
3173 state, so just printing out the stack every time around the parse loop
3174 can make it possible to see exactly what is happening.
3175
3176 This doesn't explicitly show each SHIFT and REDUCE action.  However they
3177 are easily deduced from the change between consecutive lines, and the
3178 details of each state can be found by cross referencing the states list
3179 in the stack with the "report" that parsergen can generate.
3180
3181 For terminal symbols, we just dump the token.  For non-terminals we
3182 print the name of the symbol.  The look ahead token is reported at the
3183 end inside square brackets.
3184
3185 ###### parser functions
3186
3187         static char *reserved_words[] = {
3188                 [TK_error]        = "ERROR",
3189                 [TK_in]           = "IN",
3190                 [TK_out]          = "OUT",
3191                 [TK_newline]      = "NEWLINE",
3192                 [TK_eof]          = "$eof",
3193         };
3194         static void parser_trace_state(FILE *trace, struct frame *f, const struct state states[])
3195         {
3196                 fprintf(trace, "(%d", f->state);
3197                 if (states[f->state].starts_line)
3198                         fprintf(trace, "s");
3199                 if (f->newline_permitted)
3200                         fprintf(trace, "n%d", f->since_newline);
3201                 fprintf(trace, ") ");
3202         }
3203
3204         void parser_trace(FILE *trace, struct parser *p,
3205                           struct token *tk, const struct state states[],
3206                           const char *non_term[], int knowns)
3207         {
3208                 int i;
3209                 if (!trace)
3210                         return;
3211                 for (i = 0; i < p->tos; i++) {
3212                         struct frame *f = &p->stack[i];
3213                         if (i) {
3214                                 int sym = f->sym;
3215                                 if (sym < TK_reserved &&
3216                                     reserved_words[sym] != NULL)
3217                                         fputs(reserved_words[sym], trace);
3218                                 else if (sym < TK_reserved + knowns) {
3219                                         struct token *t = p->asn_stack[i];
3220                                         text_dump(trace, t->txt, 20);
3221                                 } else
3222                                         fputs(non_term[sym - TK_reserved - knowns],
3223                                               trace);
3224                                 if (f->indents)
3225                                         fprintf(trace, ".%d", f->indents);
3226                                 if (f->since_newline == 0)
3227                                         fputs("/", trace);
3228                                 fputs(" ", trace);
3229                         }
3230                         parser_trace_state(trace, f, states);
3231                 }
3232                 fprintf(trace, "[");
3233                 if (tk->num < TK_reserved &&
3234                     reserved_words[tk->num] != NULL)
3235                         fputs(reserved_words[tk->num], trace);
3236                 else
3237                         text_dump(trace, tk->txt, 20);
3238                 fprintf(trace, ":%d:%d]", tk->line, tk->col);
3239         }
3240
3241         void parser_trace_action(FILE *trace, char *action)
3242         {
3243                 if (trace)
3244                         fprintf(trace, " - %s\n", action);
3245         }
3246
3247 # A Worked Example
3248
3249 The obvious example for a parser is a calculator.
3250
3251 As `scanner` provides number parsing function using `libgmp` is it not much
3252 work to perform arbitrary rational number calculations.
3253
3254 This calculator takes one expression, or an equality test, per line.  The
3255 results are printed and if any equality test fails, the program exits with
3256 an error.
3257
3258 ###### File: parsergen.mk
3259         calc.c calc.h : parsergen parsergen.mdc
3260                 ./parsergen --tag calc -o calc parsergen.mdc
3261         calc : calc.o libparser.o libscanner.o libmdcode.o libnumber.o
3262                 $(CC) $(CFLAGS) -o calc calc.o libparser.o libscanner.o libmdcode.o libnumber.o -licuuc -lgmp
3263         calctest : calc
3264                 ./calc parsergen.mdc
3265         demos :: calctest
3266
3267 # calc: header
3268
3269         #include "parse_number.h"
3270         // what do we use for a demo-grammar?  A calculator of course.
3271         struct number {
3272                 mpq_t val;
3273                 char tail[2];
3274                 int err;
3275         };
3276
3277 # calc: code
3278
3279         #include <stdlib.h>
3280         #include <unistd.h>
3281         #include <fcntl.h>
3282         #include <sys/mman.h>
3283         #include <stdio.h>
3284         #include <malloc.h>
3285         #include <gmp.h>
3286         #include <string.h>
3287         #include "mdcode.h"
3288         #include "scanner.h"
3289         #include "parser.h"
3290
3291         #include "calc.h"
3292
3293         static void free_number(struct number *n)
3294         {
3295                 mpq_clear(n->val);
3296                 free(n);
3297         }
3298
3299         static int text_is(struct text t, char *s)
3300         {
3301                 return (strlen(s) == t.len &&
3302                         strncmp(s, t.txt, t.len) == 0);
3303         }
3304
3305         int main(int argc, char *argv[])
3306         {
3307                 int fd = open(argv[1], O_RDONLY);
3308                 int len = lseek(fd, 0, 2);
3309                 char *file = mmap(NULL, len, PROT_READ, MAP_SHARED, fd, 0);
3310                 struct section *table = code_extract(file, file+len, NULL);
3311                 struct section *s;
3312                 struct token_config config = {
3313                         .ignored = (1 << TK_line_comment)
3314                                  | (1 << TK_in)
3315                                  | (1 << TK_out),
3316                         .number_chars = ".,_+-",
3317                         .word_start = "",
3318                         .word_cont = "",
3319                 };
3320                 for (s = table; s; s = s->next)
3321                         if (text_is(s->section, "example: input"))
3322                                 parse_calc(s->code, &config, argc > 2 ? stderr : NULL);
3323                 while (table) {
3324                         struct section *t = table->next;
3325                         code_free(table->code);
3326                         free(table);
3327                         table = t;
3328                 }
3329                 exit(0);
3330         }
3331
3332 # calc: grammar
3333
3334         $LEFT + -
3335         $LEFT * / //
3336
3337         Session -> Session Line
3338                 | Line
3339
3340         Line -> Expression NEWLINE ${ gmp_printf("Answer = %Qd\n", $1.val);
3341                                         { mpf_t fl; mpf_init2(fl, 20); mpf_set_q(fl, $1.val);
3342                                         gmp_printf("  or as a decimal: %Fg\n", fl);
3343                                         mpf_clear(fl);
3344                                         }
3345                                      }$
3346                 | Expression = Expression NEWLINE ${
3347                         if (mpq_equal($1.val, $3.val))
3348                                 gmp_printf("Both equal %Qd\n", $1.val);
3349                         else {
3350                                 gmp_printf("NOT EQUAL: %Qd\n      != : %Qd\n",
3351                                         $1.val, $3.val);
3352                                 exit(1);
3353                         }
3354                 }$
3355                 | NEWLINE ${ printf("Blank line\n"); }$
3356                 | ERROR NEWLINE ${ printf("Skipped a bad line\n"); }$
3357
3358         $number
3359         Expression -> Expression + Expression ${ mpq_init($0.val); mpq_add($0.val, $1.val, $3.val); }$
3360                 | Expression - Expression ${ mpq_init($0.val); mpq_sub($0.val, $1.val, $3.val); }$
3361                 | Expression * Expression ${ mpq_init($0.val); mpq_mul($0.val, $1.val, $3.val); }$
3362                 | Expression / Expression ${ mpq_init($0.val); mpq_div($0.val, $1.val, $3.val); }$
3363                 | Expression // Expression ${ {
3364                         mpz_t z0, z1, z2;
3365                         mpq_init($0.val);
3366                         mpz_init(z0); mpz_init(z1); mpz_init(z2);
3367                         mpz_tdiv_q(z1, mpq_numref($1.val), mpq_denref($1.val));
3368                         mpz_tdiv_q(z2, mpq_numref($3.val), mpq_denref($3.val));
3369                         mpz_tdiv_q(z0, z1, z2);
3370                         mpq_set_z($0.val, z0);
3371                         mpz_clear(z0); mpz_clear(z1); mpz_clear(z2);
3372                 } }$
3373                 | NUMBER ${ if (number_parse($0.val, $0.tail, $1.txt) == 0) mpq_init($0.val); }$
3374                 | ( Expression ) ${ mpq_init($0.val); mpq_set($0.val, $2.val); }$
3375
3376 # example: input
3377
3378         355/113
3379         3.1415926535 - 355/113
3380         2 + 4 * 5
3381         1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9
3382         10 * 9 / 2
3383         1 * 1000 + 2 * 100 + 3 * 10 + 4 * 1
3384
3385         355//113
3386
3387         error