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