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