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