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