]> ocean-lang.org Git - ocean/blob - csrc/parsergen.mdc
Newline handling stuff
[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 `starts_line`
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 section.
879
880 To know what is line-like, we first need to know which symbols can end
881 a line-like section, which is precisely those which can end with a
882 newline token.  These symbols don't necessarily alway end with a
883 newline, but they can.  Hence they are not described as "lines" but
884 only "line-like".
885
886 Clearly the `TK_newline` token can end with a newline.  Any symbol
887 which is the head of a production that contains a line-ending symbol
888 followed only by nullable symbols is also a line-ending symbol.  We
889 use a new field `can_eol` to record this attribute of symbols, and
890 compute it in a repetitive manner similar to `set_nullable`.
891
892 ###### symbol fields
893         int can_eol;
894         int starts_line;
895
896 ###### functions
897         static void set_can_eol(struct grammar *g)
898         {
899                 int check_again = 1;
900                 g->symtab[TK_newline]->can_eol = 1;
901                 while (check_again) {
902                         int p;
903                         check_again = 0;
904                         for (p = 0; p < g->production_count; p++) {
905                                 struct production *pr = g->productions[p];
906                                 int s;
907
908                                 if (pr->head->can_eol)
909                                         continue;
910
911                                 for (s = pr->body_size - 1; s >= 0; s--) {
912                                         if (pr->body[s]->can_eol) {
913                                                 pr->head->can_eol = 1;
914                                                 check_again = 1;
915                                                 break;
916                                         }
917                                         if (!pr->body[s]->nullable)
918                                                 break;
919                                 }
920                         }
921                 }
922         }
923
924         static void set_starts_line(struct grammar *g)
925         {
926                 int p;
927                 for (p = 0; p < g->production_count; p++) {
928                         struct production *pr = g->productions[p];
929                         int s;
930
931                         for (s = 0; s < pr->body_size - 1; s++)
932                                 if (pr->body[s]->can_eol)
933                                         pr->body[s+1]->starts_line = 1;
934                 }
935         }
936
937 ### Building the `first` sets
938
939 When calculating what can follow a particular non-terminal, we will need to
940 know what the "first" terminal in any subsequent non-terminal might be.  So
941 we calculate the `first` set for every non-terminal and store them in an
942 array.  We don't bother recording the "first" set for terminals as they are
943 trivial.
944
945 As the "first" for one symbol might depend on the "first" of another,
946 we repeat the calculations until no changes happen, just like with
947 `set_nullable`.  This makes use of the fact that `symset_union`
948 reports if any change happens.
949
950 The core of this which finds the "first" of part of a production body
951 will be reused for computing the "follow" sets, so we split it out
952 into a separate function.
953
954 ###### grammar fields
955         struct symset *first;
956
957 ###### functions
958
959         static int add_first(struct production *pr, int start,
960                              struct symset *target, struct grammar *g,
961                              int *to_end)
962         {
963                 int s;
964                 int changed = 0;
965                 for (s = start; s < pr->body_size; s++) {
966                         struct symbol *bs = pr->body[s];
967                         if (bs->type == Terminal) {
968                                 if (symset_find(target, bs->num) < 0) {
969                                         symset_add(target, bs->num, 0);
970                                         changed = 1;
971                                 }
972                                 break;
973                         } else if (symset_union(target, &g->first[bs->num]))
974                                 changed = 1;
975                         if (!bs->nullable)
976                                 break;
977                 }
978                 if (to_end)
979                         *to_end = (s == pr->body_size);
980                 return changed;
981         }
982
983         static void build_first(struct grammar *g)
984         {
985                 int check_again = 1;
986                 int s;
987                 g->first = calloc(g->num_syms, sizeof(g->first[0]));
988                 for (s = 0; s < g->num_syms; s++)
989                         g->first[s] = INIT_SYMSET;
990
991                 while (check_again) {
992                         int p;
993                         check_again = 0;
994                         for (p = 0; p < g->production_count; p++) {
995                                 struct production *pr = g->productions[p];
996                                 struct symset *head = &g->first[pr->head->num];
997
998                                 if (add_first(pr, 0, head, g, NULL))
999                                         check_again = 1;
1000                         }
1001                 }
1002         }
1003
1004 ### Building the `follow` sets.
1005
1006 There are two different situations when we will want to generate "follow"
1007 sets.  If we are doing an SLR analysis, we want to generate a single
1008 "follow" set for each non-terminal in the grammar.  That is what is
1009 happening here.  If we are doing an LALR or LR analysis we will want
1010 to generate a separate "LA" set for each item.  We do that later
1011 in state generation.
1012
1013 There are two parts to generating a "follow" set.  Firstly we look at
1014 every place that any non-terminal appears in the body of any
1015 production, and we find the set of possible "first" symbols after
1016 there.  This is done using `add_first` above and only needs to be done
1017 once as the "first" sets are now stable and will not change.
1018
1019 ###### follow code
1020
1021         for (p = 0; p < g->production_count; p++) {
1022                 struct production *pr = g->productions[p];
1023                 int b;
1024
1025                 for (b = 0; b < pr->body_size - 1; b++) {
1026                         struct symbol *bs = pr->body[b];
1027                         if (bs->type == Terminal)
1028                                 continue;
1029                         add_first(pr, b+1, &g->follow[bs->num], g, NULL);
1030                 }
1031         }
1032
1033 The second part is to add the "follow" set of the head of a production
1034 to the "follow" sets of the final symbol in the production, and any
1035 other symbol which is followed only by `nullable` symbols.  As this
1036 depends on "follow" itself we need to repeatedly perform the process
1037 until no further changes happen.
1038
1039 ###### follow code
1040
1041         for (again = 0, p = 0;
1042              p < g->production_count;
1043              p < g->production_count-1
1044                 ? p++ : again ? (again = 0, p = 0)
1045                               : p++) {
1046                 struct production *pr = g->productions[p];
1047                 int b;
1048
1049                 for (b = pr->body_size - 1; b >= 0; b--) {
1050                         struct symbol *bs = pr->body[b];
1051                         if (bs->type == Terminal)
1052                                 break;
1053                         if (symset_union(&g->follow[bs->num],
1054                                          &g->follow[pr->head->num]))
1055                                 again = 1;
1056                         if (!bs->nullable)
1057                                 break;
1058                 }
1059         }
1060
1061 We now just need to create and initialise the `follow` list to get a
1062 complete function.
1063
1064 ###### grammar fields
1065         struct symset *follow;
1066
1067 ###### functions
1068         static void build_follow(struct grammar *g)
1069         {
1070                 int s, again, p;
1071                 g->follow = calloc(g->num_syms, sizeof(g->follow[0]));
1072                 for (s = 0; s < g->num_syms; s++)
1073                         g->follow[s] = INIT_SYMSET;
1074                 ## follow code
1075         }
1076
1077 ### Building itemsets and states
1078
1079 There are three different levels of detail that can be chosen for
1080 building the itemsets and states for the LR grammar.  They are:
1081
1082 1. LR(0) or SLR(1), where no look-ahead is considered.
1083 2. LALR(1) where we build look-ahead sets with each item and merge
1084    the LA sets when we find two paths to the same "kernel" set of items.
1085 3. LR(1) where different look-ahead for any item in the set means
1086    a different state must be created.
1087
1088 ###### forward declarations
1089         enum grammar_type { LR0, LR05, SLR, LALR, LR1 };
1090
1091 We need to be able to look through existing states to see if a newly
1092 generated state already exists.  For now we use a simple sorted linked
1093 list.
1094
1095 An item is a pair of numbers: the production number and the position of
1096 "DOT", which is an index into the body of the production.
1097 As the numbers are not enormous we can combine them into a single "short"
1098 and store them in a `symset` - 4 bits for "DOT" and 12 bits for the
1099 production number (so 4000 productions with maximum of 15 symbols in the
1100 body).
1101
1102 Comparing the itemsets will be a little different to comparing symsets
1103 as we want to do the lookup after generating the "kernel" of an
1104 itemset, so we need to ignore the offset=zero items which are added during
1105 completion.
1106
1107 To facilitate this, we modify the "DOT" number so that "0" sorts to
1108 the end of the list in the symset, and then only compare items before
1109 the first "0".
1110
1111 ###### declarations
1112         static inline unsigned short item_num(int production, int index)
1113         {
1114                 return production | ((31-index) << 11);
1115         }
1116         static inline int item_prod(unsigned short item)
1117         {
1118                 return item & 0x7ff;
1119         }
1120         static inline int item_index(unsigned short item)
1121         {
1122                 return (31-(item >> 11)) & 0x1f;
1123         }
1124
1125 For LR(1) analysis we need to compare not just the itemset in a state
1126 but also the LA sets.  As we assign each unique LA set a number, we
1127 can just compare the symset and the data values together.
1128
1129 ###### functions
1130         static int itemset_cmp(struct symset a, struct symset b,
1131                                enum grammar_type type)
1132         {
1133                 int i;
1134                 int av, bv;
1135
1136                 for (i = 0;
1137                      i < a.cnt && i < b.cnt &&
1138                      item_index(a.syms[i]) > 0 &&
1139                      item_index(b.syms[i]) > 0;
1140                      i++) {
1141                         int diff = a.syms[i] - b.syms[i];
1142                         if (diff)
1143                                 return diff;
1144                         if (type == LR1) {
1145                                 diff = a.data[i] - b.data[i];
1146                                 if (diff)
1147                                         return diff;
1148                         }
1149                 }
1150                 if (i == a.cnt || item_index(a.syms[i]) == 0)
1151                         av = -1;
1152                 else
1153                         av = a.syms[i];
1154                 if (i == b.cnt || item_index(b.syms[i]) == 0)
1155                         bv = -1;
1156                 else
1157                         bv = b.syms[i];
1158                 if (av - bv)
1159                         return av - bv;
1160                 if (type < LR1 || av == -1)
1161                         return 0;
1162                 return
1163                         a.data[i] - b.data[i];
1164         }
1165
1166 And now we can build the list of itemsets.  The lookup routine returns
1167 both a success flag and a pointer to where in the list an insert
1168 should happen, so we don't need to search a second time.
1169
1170 ###### declarations
1171         struct itemset {
1172                 struct itemset *next;
1173                 short state;
1174                 struct symset items;
1175                 struct symset go_to;
1176                 char completed;
1177                 char starts_line;
1178         };
1179
1180 ###### grammar fields
1181         struct itemset *items;
1182         int states;
1183
1184 ###### functions
1185         static int itemset_find(struct grammar *g, struct itemset ***where,
1186                                 struct symset kernel, enum grammar_type type)
1187         {
1188                 struct itemset **ip;
1189
1190                 for (ip = &g->items; *ip ; ip = & (*ip)->next) {
1191                         struct itemset *i = *ip;
1192                         int diff;
1193                         diff = itemset_cmp(i->items, kernel, type);
1194                         if (diff < 0)
1195                                 continue;
1196                         if (diff > 0)
1197                                 break;
1198                         /* found */
1199                         *where = ip;
1200                         return 1;
1201                 }
1202                 *where = ip;
1203                 return 0;
1204         }
1205
1206 Adding an itemset may require merging the LA sets if LALR analysis is
1207 happening. If any new LA set adds any symbols that weren't in the old LA set, we
1208 clear the `completed` flag so that the dependants of this itemset will be
1209 recalculated and their LA sets updated.
1210
1211 `add_itemset` must consume the symsets it is passed, either by adding
1212 them to a data structure, of freeing them.
1213
1214         static int add_itemset(struct grammar *g, struct symset ss,
1215                                enum grammar_type type)
1216         {
1217                 struct itemset **where, *is;
1218                 int i;
1219                 int found = itemset_find(g, &where, ss, type);
1220                 if (!found) {
1221                         is = calloc(1, sizeof(*is));
1222                         is->state = g->states;
1223                         g->states += 1;
1224                         is->items = ss;
1225                         is->next = *where;
1226                         is->go_to = INIT_DATASET;
1227                         *where = is;
1228                         return is->state;
1229                 }
1230                 is = *where;
1231                 if (type != LALR) {
1232                         symset_free(ss);
1233                         return is->state;
1234                 }
1235                 for (i = 0; i < ss.cnt; i++) {
1236                         struct symset temp = INIT_SYMSET, s;
1237                         if (ss.data[i] == is->items.data[i])
1238                                 continue;
1239                         s = set_find(g, is->items.data[i]);
1240                         symset_union(&temp, &s);
1241                         s = set_find(g, ss.data[i]);
1242                         if (symset_union(&temp, &s)) {
1243                                 is->items.data[i] = save_set(g, temp);
1244                                 is->completed = 0;
1245                         } else
1246                                 symset_free(temp);
1247                 }
1248                 symset_free(ss);
1249                 return is->state;
1250         }
1251
1252 #### The build
1253
1254 To build all the itemsets, we first insert the initial itemset made
1255 from production zero, complete each itemset, and then generate new
1256 itemsets from old until no new ones can be made.
1257
1258 Completing an itemset means finding all the items where "DOT" is followed by
1259 a nonterminal and adding "DOT=0" items for every production from that
1260 non-terminal - providing each item hasn't already been added.
1261
1262 If LA sets are needed, the LA set for each new item is found using
1263 `add_first` which was developed earlier for `FIRST` and `FOLLOW`.  This may
1264 be supplemented by the LA set for the item which produce the new item.
1265
1266 We also collect a set of all symbols which follow "DOT" (in `done`) as this
1267 is used in the next stage.
1268 If any of these symbols are flagged as starting a line, then this
1269 state must be a `starts_line` state so now is a good time to record that.
1270
1271 NOTE: precedence handling should happen here - I haven't written this yet
1272 though.
1273
1274 ###### complete itemset
1275         for (i = 0; i < is->items.cnt; i++) {
1276                 int p = item_prod(is->items.syms[i]);
1277                 int bs = item_index(is->items.syms[i]);
1278                 struct production *pr = g->productions[p];
1279                 int p2;
1280                 struct symbol *s;
1281                 struct symset LA = INIT_SYMSET;
1282                 unsigned short sn = 0;
1283
1284                 if (bs == pr->body_size)
1285                         continue;
1286                 s = pr->body[bs];
1287                 if (symset_find(&done, s->num) < 0) {
1288                         symset_add(&done, s->num, 0);
1289                         if (s->starts_line)
1290                                 is->starts_line = 1;
1291                 }
1292                 if (s->type != Nonterminal)
1293                         continue;
1294                 again = 1;
1295                 if (type >= LALR) {
1296                         // Need the LA set.
1297                         int to_end;
1298                         add_first(pr, bs+1, &LA, g, &to_end);
1299                         if (to_end) {
1300                                 struct symset ss = set_find(g, is->items.data[i]);
1301                                 symset_union(&LA, &ss);
1302                         }
1303                         sn = save_set(g, LA);
1304                         LA = set_find(g, sn);
1305                 }
1306
1307                 /* Add productions for this symbol */
1308                 for (p2 = s->first_production;
1309                      p2 < g->production_count &&
1310                       g->productions[p2]->head == s;
1311                      p2++) {
1312                         int itm = item_num(p2, 0);
1313                         int pos = symset_find(&is->items, itm);
1314                         if (pos < 0) {
1315                                 symset_add(&is->items, itm, sn);
1316                                 /* Will have re-ordered, so start
1317                                  * from beginning again */
1318                                 i = -1;
1319                         } else if (type >= LALR) {
1320                                 struct symset ss = set_find(g, is->items.data[pos]);
1321                                 struct symset tmp = INIT_SYMSET;
1322
1323                                 symset_union(&tmp, &ss);
1324                                 if (symset_union(&tmp, &LA)) {
1325                                         is->items.data[pos] = save_set(g, tmp);
1326                                         i = -1;
1327                                 }else
1328                                         symset_free(tmp);
1329                         }
1330                 }
1331         }
1332
1333 For each symbol we found (and placed in `done`) we collect all the items for
1334 which this symbol is next, and create a new itemset with "DOT" advanced over
1335 the symbol.  This is then added to the collection of itemsets (or merged
1336 with a pre-existing itemset).
1337
1338 ###### derive itemsets
1339         // Now we have a completed itemset, so we need to
1340         // compute all the 'next' itemsets and create them
1341         // if they don't exist.
1342         for (i = 0; i < done.cnt; i++) {
1343                 int j;
1344                 unsigned short state;
1345                 struct symbol *sym = g->symtab[done.syms[i]];
1346                 struct symset newitemset = INIT_SYMSET;
1347                 if (type >= LALR)
1348                         newitemset = INIT_DATASET;
1349
1350                 for (j = 0; j < is->items.cnt; j++) {
1351                         int itm = is->items.syms[j];
1352                         int p = item_prod(itm);
1353                         int bp = item_index(itm);
1354                         struct production *pr = g->productions[p];
1355                         unsigned short la = 0;
1356                         int pos;
1357
1358                         if (bp == pr->body_size)
1359                                 continue;
1360                         if (pr->body[bp] != sym)
1361                                 continue;
1362                         if (type >= LALR)
1363                                 la = is->items.data[j];
1364                         pos = symset_find(&newitemset, pr->head->num);
1365                         if (pos < 0)
1366                                 symset_add(&newitemset, item_num(p, bp+1), la);
1367                         else if (type >= LALR) {
1368                                 // Need to merge la set.
1369                                 int la2 = newitemset.data[pos];
1370                                 if (la != la2) {
1371                                         struct symset ss = set_find(g, la2);
1372                                         struct symset LA = INIT_SYMSET;
1373                                         symset_union(&LA, &ss);
1374                                         ss = set_find(g, la);
1375                                         if (symset_union(&LA, &ss))
1376                                                 newitemset.data[pos] = save_set(g, LA);
1377                                         else
1378                                                 symset_free(LA);
1379                                 }
1380                         }
1381                 }
1382                 state = add_itemset(g, newitemset, type);
1383                 if (symset_find(&is->go_to, done.syms[i]) < 0)
1384                         symset_add(&is->go_to, done.syms[i], state);
1385         }
1386
1387 All that is left is to crate the initial itemset from production zero, and
1388 with `TK_eof` as the LA set.
1389
1390 ###### functions
1391         static void build_itemsets(struct grammar *g, enum grammar_type type)
1392         {
1393                 struct symset first = INIT_SYMSET;
1394                 struct itemset *is;
1395                 int again;
1396                 unsigned short la = 0;
1397                 if (type >= LALR) {
1398                         // LA set just has eof
1399                         struct symset eof = INIT_SYMSET;
1400                         symset_add(&eof, TK_eof, 0);
1401                         la = save_set(g, eof);
1402                         first = INIT_DATASET;
1403                 }
1404                 // production 0, offset 0 (with no data)
1405                 symset_add(&first, item_num(0, 0), la);
1406                 add_itemset(g, first, type);
1407                 for (again = 0, is = g->items;
1408                      is;
1409                      is = is->next ?: again ? (again = 0, g->items) : NULL) {
1410                         int i;
1411                         struct symset done = INIT_SYMSET;
1412                         if (is->completed)
1413                                 continue;
1414                         is->completed = 1;
1415                         again = 1;
1416                         ## complete itemset
1417                         ## derive itemsets
1418                         symset_free(done);
1419                 }
1420         }
1421
1422 ### Completing the analysis.
1423
1424 The exact process of analysis depends on which level was requested.  For
1425 `LR0` and `LR05` we don't need first and follow sets at all.  For `LALR` and
1426 `LR1` we need first, but not follow.  For `SLR` we need both.
1427
1428 We don't build the "action" tables that you might expect as the parser
1429 doesn't use them.  They will be calculated to some extent if needed for
1430 a report.
1431
1432 Once we have built everything we allocate arrays for the two lists:
1433 symbols and itemsets.  This allows more efficient access during reporting.
1434 The symbols are grouped as terminals and non-terminals and we record the
1435 changeover point in `first_nonterm`.
1436
1437 ###### grammar fields
1438         struct symbol **symtab;
1439         struct itemset **statetab;
1440         int first_nonterm;
1441
1442 ###### grammar_analyse
1443
1444         static void grammar_analyse(struct grammar *g, enum grammar_type type)
1445         {
1446                 struct symbol *s;
1447                 struct itemset *is;
1448                 int snum = TK_reserved;
1449                 for (s = g->syms; s; s = s->next)
1450                         if (s->num < 0 && s->type == Terminal) {
1451                                 s->num = snum;
1452                                 snum++;
1453                         }
1454                 g->first_nonterm = snum;
1455                 for (s = g->syms; s; s = s->next)
1456                         if (s->num < 0) {
1457                                 s->num = snum;
1458                                 snum++;
1459                         }
1460                 g->num_syms = snum;
1461                 g->symtab = calloc(g->num_syms, sizeof(g->symtab[0]));
1462                 for (s = g->syms; s; s = s->next)
1463                         g->symtab[s->num] = s;
1464
1465                 set_nullable(g);
1466                 set_can_eol(g);
1467                 set_starts_line(g);
1468                 if (type >= SLR)
1469                         build_first(g);
1470
1471                 if (type == SLR)
1472                         build_follow(g);
1473
1474                 build_itemsets(g, type);
1475
1476                 g->statetab = calloc(g->states, sizeof(g->statetab[0]));
1477                 for (is = g->items; is ; is = is->next)
1478                         g->statetab[is->state] = is;
1479         }
1480
1481 ## Reporting on the Grammar
1482
1483 The purpose of the report is to give the grammar developer insight into
1484 how the grammar parser will work.  It is basically a structured dump of
1485 all the tables that have been generated, plus a description of any conflicts.
1486
1487 ###### grammar_report
1488         static int grammar_report(struct grammar *g, enum grammar_type type)
1489         {
1490                 report_symbols(g);
1491                 if (g->follow)
1492                         report_follow(g);
1493                 report_itemsets(g);
1494                 return report_conflicts(g, type);
1495         }
1496
1497 Firstly we have the complete list of symbols, together with the
1498 "FIRST" set if that was generated.  We add a mark to each symbol to
1499 show if it can end in a newline (`>`), if it implies the start of a
1500 line (`<`), or if it is nullable (`.`).
1501
1502 ###### functions
1503
1504         static void report_symbols(struct grammar *g)
1505         {
1506                 int n;
1507                 if (g->first)
1508                         printf("SYMBOLS + FIRST:\n");
1509                 else
1510                         printf("SYMBOLS:\n");
1511
1512                 for (n = 0; n < g->num_syms; n++) {
1513                         struct symbol *s = g->symtab[n];
1514                         if (!s)
1515                                 continue;
1516
1517                         printf(" %c%c%c%3d%c: ",
1518                                s->nullable ? '.':' ',
1519                                s->can_eol ? '>':' ',
1520                                s->starts_line ? '<':' ',
1521                                s->num, symtypes[s->type]);
1522                         prtxt(s->name);
1523                         if (s->precedence)
1524                                 printf(" (%d%s)", s->precedence,
1525                                        assoc_names[s->assoc]);
1526
1527                         if (g->first && s->type == Nonterminal) {
1528                                 int j;
1529                                 char c = ':';
1530                                 for (j = 0; j < g->first[n].cnt; j++) {
1531                                         printf("%c ", c);
1532                                         c = ',';
1533                                         prtxt(g->symtab[g->first[n].syms[j]]->name);
1534                                 }
1535                         }
1536                         printf("\n");
1537                 }
1538         }
1539
1540 Then we have the follow sets if they were computed.
1541
1542         static void report_follow(struct grammar *g)
1543         {
1544                 int n;
1545                 printf("FOLLOW:\n");
1546                 for (n = 0; n < g->num_syms; n++)
1547                         if (g->follow[n].cnt) {
1548                                 int j;
1549                                 char c = ':';
1550                                 printf("  ");
1551                                 prtxt(g->symtab[n]->name);
1552                                 for (j = 0; j < g->follow[n].cnt; j++) {
1553                                         printf("%c ", c);
1554                                         c = ',';
1555                                         prtxt(g->symtab[g->follow[n].syms[j]]->name);
1556                                 }
1557                                 printf("\n");
1558                         }
1559         }
1560
1561 And finally the item sets.  These include the GO TO tables and, for
1562 LALR and LR1, the LA set for each item.  Lots of stuff, so we break
1563 it up a bit.  First the items, with production number and associativity.
1564
1565         static void report_item(struct grammar *g, int itm)
1566         {
1567                 int p = item_prod(itm);
1568                 int dot = item_index(itm);
1569                 struct production *pr = g->productions[p];
1570                 int i;
1571
1572                 printf("    ");
1573                 prtxt(pr->head->name);
1574                 printf(" ->");
1575                 for (i = 0; i < pr->body_size; i++) {
1576                         printf(" %s", (dot == i ? ". ": ""));
1577                         prtxt(pr->body[i]->name);
1578                 }
1579                 if (dot == pr->body_size)
1580                         printf(" .");
1581                 printf(" [%d]", p);
1582                 if (pr->precedence)
1583                         printf(" (%d%s)", pr->precedence,
1584                                assoc_names[pr->assoc]);
1585                 printf("\n");
1586         }
1587
1588 The LA sets which are (possibly) reported with each item:
1589
1590         static void report_la(struct grammar *g, int lanum)
1591         {
1592                 struct symset la = set_find(g, lanum);
1593                 int i;
1594                 char c = ':';
1595
1596                 printf("        LOOK AHEAD(%d)", lanum);
1597                 for (i = 0; i < la.cnt; i++) {
1598                         printf("%c ", c);
1599                         c = ',';
1600                         prtxt(g->symtab[la.syms[i]]->name);
1601                 }
1602                 printf("\n");
1603         }
1604
1605 Then the go to sets:
1606
1607
1608         static void report_goto(struct grammar *g, struct symset gt)
1609         {
1610                 int i;
1611                 printf("    GOTO:\n");
1612
1613                 for (i = 0; i < gt.cnt; i++) {
1614                         printf("      ");
1615                         prtxt(g->symtab[gt.syms[i]]->name);
1616                         printf(" -> %d\n", gt.data[i]);
1617                 }
1618         }
1619
1620 Now we can report all the item sets complete with items, LA sets, and GO TO.
1621
1622         static void report_itemsets(struct grammar *g)
1623         {
1624                 int s;
1625                 printf("ITEM SETS(%d)\n", g->states);
1626                 for (s = 0; s < g->states; s++) {
1627                         int j;
1628                         struct itemset *is = g->statetab[s];
1629                         printf("  Itemset %d:%s\n", s, is->starts_line?" (startsline)":"");
1630                         for (j = 0; j < is->items.cnt; j++) {
1631                                 report_item(g, is->items.syms[j]);
1632                                 if (is->items.data != NO_DATA)
1633                                         report_la(g, is->items.data[j]);
1634                         }
1635                         report_goto(g, is->go_to);
1636                 }
1637         }
1638
1639 ### Reporting conflicts
1640
1641 Conflict detection varies a lot among different analysis levels.  However
1642 LR0 and LR0.5 are quite similar - having no follow sets, and SLR, LALR and
1643 LR1 are also similar as they have FOLLOW or LA sets.
1644
1645 ###### functions
1646
1647         ## conflict functions
1648
1649         static int report_conflicts(struct grammar *g, enum grammar_type type)
1650         {
1651                 int cnt = 0;
1652                 printf("Conflicts:\n");
1653                 if (type < SLR)
1654                         cnt = conflicts_lr0(g, type);
1655                 else
1656                         cnt = conflicts_slr(g, type);
1657                 if (cnt == 0)
1658                         printf(" - no conflicts\n");
1659                 return cnt;
1660         }
1661
1662 LR0 conflicts are any state which have both a reducible item and
1663 a shiftable item, or two reducible items.
1664
1665 LR05 conflicts only occurs if two possibly reductions exist,
1666 as shifts always over-ride reductions.
1667
1668 ###### conflict functions
1669         static int conflicts_lr0(struct grammar *g, enum grammar_type type)
1670         {
1671                 int i;
1672                 int cnt = 0;
1673                 for (i = 0; i < g->states; i++) {
1674                         struct itemset *is = g->statetab[i];
1675                         int last_reduce = -1;
1676                         int prev_reduce = -1;
1677                         int last_shift = -1;
1678                         int j;
1679                         if (!is)
1680                                 continue;
1681                         for (j = 0; j < is->items.cnt; j++) {
1682                                 int itm = is->items.syms[j];
1683                                 int p = item_prod(itm);
1684                                 int bp = item_index(itm);
1685                                 struct production *pr = g->productions[p];
1686
1687                                 if (bp == pr->body_size) {
1688                                         prev_reduce = last_reduce;
1689                                         last_reduce = j;
1690                                         continue;
1691                                 }
1692                                 if (pr->body[bp]->type == Terminal)
1693                                         last_shift = j;
1694                         }
1695                         if (type == LR0 && last_reduce >= 0 && last_shift >= 0) {
1696                                 printf("  State %d has both SHIFT and REDUCE:\n", i);
1697                                 report_item(g, is->items.syms[last_shift]);
1698                                 report_item(g, is->items.syms[last_reduce]);
1699                                 cnt++;
1700                         }
1701                         if (prev_reduce >= 0) {
1702                                 printf("  State %d has 2 (or more) reducible items\n", i);
1703                                 report_item(g, is->items.syms[prev_reduce]);
1704                                 report_item(g, is->items.syms[last_reduce]);
1705                                 cnt++;
1706                         }
1707                 }
1708                 return cnt;
1709         }
1710
1711 SLR, LALR, and LR1 conflicts happen if two reducible items have over-lapping
1712 look ahead, or if a symbol in a look-ahead can be shifted.  They differ only
1713 in the source of the look ahead set.
1714
1715 We build two datasets to reflect the "action" table: one which maps
1716 terminals to items where that terminal could be shifted and another
1717 which maps terminals to items that could be reduced when the terminal
1718 is in look-ahead.  We report when we get conflicts between the two.
1719
1720         static int conflicts_slr(struct grammar *g, enum grammar_type type)
1721         {
1722                 int i;
1723                 int cnt = 0;
1724
1725                 for (i = 0; i < g->states; i++) {
1726                         struct itemset *is = g->statetab[i];
1727                         struct symset shifts = INIT_DATASET;
1728                         struct symset reduce = INIT_DATASET;
1729                         int j;
1730                         if (!is)
1731                                 continue;
1732                         /* First collect the shifts */
1733                         for (j = 0; j < is->items.cnt; j++) {
1734                                 unsigned short itm = is->items.syms[j];
1735                                 int p = item_prod(itm);
1736                                 int bp = item_index(itm);
1737                                 struct production *pr = g->productions[p];
1738
1739                                 if (bp < pr->body_size &&
1740                                     pr->body[bp]->type == Terminal) {
1741                                         /* shiftable */
1742                                         int sym = pr->body[bp]->num;
1743                                         if (symset_find(&shifts, sym) < 0)
1744                                                 symset_add(&shifts, sym, itm);
1745                                 }
1746                         }
1747                         /* Now look for reduction and conflicts */
1748                         for (j = 0; j < is->items.cnt; j++) {
1749                                 unsigned short itm = is->items.syms[j];
1750                                 int p = item_prod(itm);
1751                                 int bp = item_index(itm);
1752                                 struct production *pr = g->productions[p];
1753
1754                                 if (bp < pr->body_size)
1755                                         continue;
1756                                 /* reducible */
1757                                 struct symset la;
1758                                 if (type == SLR)
1759                                         la = g->follow[pr->head->num];
1760                                 else
1761                                         la = set_find(g, is->items.data[j]);
1762                                 int k;
1763                                 for (k = 0; k < la.cnt; k++) {
1764                                         int pos = symset_find(&shifts, la.syms[k]);
1765                                         if (pos >= 0) {
1766                                                 printf("  State %d has SHIFT/REDUCE conflict on ", i);
1767                                                 prtxt(g->symtab[la.syms[k]]->name);
1768                                                 printf(":\n");
1769                                                 report_item(g, shifts.data[pos]);
1770                                                 report_item(g, itm);
1771                                                 cnt++;
1772                                         }
1773                                         pos = symset_find(&reduce, la.syms[k]);
1774                                         if (pos < 0) {
1775                                                 symset_add(&reduce, la.syms[k], itm);
1776                                                 continue;
1777                                         }
1778                                         printf("  State %d has REDUCE/REDUCE conflict on ", i);
1779                                         prtxt(g->symtab[la.syms[k]]->name);
1780                                         printf(":\n");
1781                                         report_item(g, itm);
1782                                         report_item(g, reduce.data[pos]);
1783                                         cnt++;
1784                                 }
1785                         }
1786                         symset_free(shifts);
1787                         symset_free(reduce);
1788                 }
1789                 return cnt;
1790         }
1791
1792
1793 ## Generating the parser
1794
1795 The exported part of the parser is the `parse_XX` function, where the name
1796 `XX` is based on the name of the parser files.
1797
1798 This takes a `code_node`, a partially initialized `token_config`, and an
1799 optional `FILE` to send tracing to.  The `token_config` gets the list of
1800 known words added and then is used with the `code_node` to initialize the
1801 scanner.
1802
1803 `parse_XX` then calls the library function `parser_run` to actually complete
1804 the parse.  This needs the `states` table and function to call the various
1805 pieces of code provided in the grammar file, so they are generated first.
1806
1807 ###### parser_generate
1808
1809         static void gen_parser(FILE *f, struct grammar *g, char *file, char *name)
1810         {
1811                 gen_known(f, g);
1812                 gen_non_term(f, g);
1813                 gen_goto(f, g);
1814                 gen_states(f, g);
1815                 gen_reduce(f, g, file);
1816                 gen_free(f, g);
1817
1818                 fprintf(f, "#line 0 \"gen_parser\"\n");
1819                 fprintf(f, "void *parse_%s(struct code_node *code, struct token_config *config, FILE *trace)\n",
1820                         name);
1821                 fprintf(f, "{\n");
1822                 fprintf(f, "\tstruct token_state *tokens;\n");
1823                 fprintf(f, "\tconfig->words_marks = known;\n");
1824                 fprintf(f, "\tconfig->known_count = sizeof(known)/sizeof(known[0]);\n");
1825                 fprintf(f, "\tconfig->ignored |= (1 << TK_line_comment) | (1 << TK_block_comment);\n");
1826                 fprintf(f, "\ttokens = token_open(code, config);\n");
1827                 fprintf(f, "\tvoid *rv = parser_run(tokens, states, do_reduce, do_free, trace, non_term, config);\n");
1828                 fprintf(f, "\ttoken_close(tokens);\n");
1829                 fprintf(f, "\treturn rv;\n");
1830                 fprintf(f, "}\n\n");
1831         }
1832
1833 ### Known words table
1834
1835 The known words table is simply an array of terminal symbols.
1836 The table of nonterminals used for tracing is a similar array.
1837
1838 ###### functions
1839
1840         static void gen_known(FILE *f, struct grammar *g)
1841         {
1842                 int i;
1843                 fprintf(f, "#line 0 \"gen_known\"\n");
1844                 fprintf(f, "static const char *known[] = {\n");
1845                 for (i = TK_reserved;
1846                      i < g->num_syms && g->symtab[i]->type == Terminal;
1847                      i++)
1848                         fprintf(f, "\t\"%.*s\",\n", g->symtab[i]->name.len,
1849                                 g->symtab[i]->name.txt);
1850                 fprintf(f, "};\n\n");
1851         }
1852
1853         static void gen_non_term(FILE *f, struct grammar *g)
1854         {
1855                 int i;
1856                 fprintf(f, "#line 0 \"gen_non_term\"\n");
1857                 fprintf(f, "static const char *non_term[] = {\n");
1858                 for (i = TK_reserved;
1859                      i < g->num_syms;
1860                      i++)
1861                         if (g->symtab[i]->type == Nonterminal)
1862                                 fprintf(f, "\t\"%.*s\",\n", g->symtab[i]->name.len,
1863                                         g->symtab[i]->name.txt);
1864                 fprintf(f, "};\n\n");
1865         }
1866
1867 ### States and the goto tables.
1868
1869 For each state we record the goto table, the reducible production if
1870 there is one, or a symbol to shift for error recovery.
1871 Some of the details of the reducible production are stored in the
1872 `do_reduce` function to come later.  Here we store the production number,
1873 the body size (useful for stack management) and the resulting symbol (useful
1874 for knowing how to free data later).
1875
1876 The go to table is stored in a simple array of `sym` and corresponding
1877 `state`.
1878
1879 ###### exported types
1880
1881         struct lookup {
1882                 short sym;
1883                 short state;
1884         };
1885         struct state {
1886                 short go_to_cnt;
1887                 const struct lookup * go_to;
1888                 short reduce_prod;
1889                 short reduce_size;
1890                 short reduce_sym;
1891                 short shift_sym;
1892                 short starts_line;
1893         };
1894
1895
1896 ###### functions
1897
1898         static void gen_goto(FILE *f, struct grammar *g)
1899         {
1900                 int i;
1901                 fprintf(f, "#line 0 \"gen_goto\"\n");
1902                 for (i = 0; i < g->states; i++) {
1903                         int j;
1904                         fprintf(f, "static const struct lookup goto_%d[] = {\n",
1905                                 i);
1906                         struct symset gt = g->statetab[i]->go_to;
1907                         for (j = 0; j < gt.cnt; j++)
1908                                 fprintf(f, "\t{ %d, %d },\n",
1909                                         gt.syms[j], gt.data[j]);
1910                         fprintf(f, "};\n");
1911                 }
1912         }
1913
1914 ###### functions
1915
1916         static void gen_states(FILE *f, struct grammar *g)
1917         {
1918                 int i;
1919                 fprintf(f, "#line 0 \"gen_states\"\n");
1920                 fprintf(f, "static const struct state states[] = {\n");
1921                 for (i = 0; i < g->states; i++) {
1922                         struct itemset *is = g->statetab[i];
1923                         int j, prod = -1, prod_len;
1924                         int shift_sym = -1;
1925                         int shift_len = 0, shift_remain = 0;
1926                         for (j = 0; j < is->items.cnt; j++) {
1927                                 int itm = is->items.syms[j];
1928                                 int p = item_prod(itm);
1929                                 int bp = item_index(itm);
1930                                 struct production *pr = g->productions[p];
1931
1932                                 if (bp < pr->body_size) {
1933                                         if (shift_sym < 0 ||
1934                                             (shift_len == bp && shift_remain > pr->body_size - bp)) {
1935                                                 shift_sym = pr->body[bp]->num;
1936                                                 shift_len = bp;
1937                                                 shift_remain = pr->body_size - bp;
1938                                         }
1939                                         continue;
1940                                 }
1941                                 /* This is what we reduce */
1942                                 if (prod < 0 || prod_len < pr->body_size) {
1943                                         prod = p;
1944                                         prod_len = pr->body_size;
1945                                 }
1946                         }
1947
1948                         if (prod >= 0)
1949                                 fprintf(f, "\t[%d] = { %d, goto_%d, %d, %d, %d, 0, %d },\n",
1950                                         i, is->go_to.cnt, i, prod,
1951                                         g->productions[prod]->body_size,
1952                                         g->productions[prod]->head->num,
1953                                         is->starts_line);
1954                         else
1955                                 fprintf(f, "\t[%d] = { %d, goto_%d, -1, -1, -1, %d, %d },\n",
1956                                         i, is->go_to.cnt, i, shift_sym,
1957                                         is->starts_line);
1958                 }
1959                 fprintf(f, "};\n\n");
1960         }
1961
1962 ### The `do_reduce` function and the code
1963
1964 When the parser engine decides to reduce a production, it calls `do_reduce`.
1965 This has two functions.
1966
1967 Firstly, if a non-NULL `trace` file is passed, it prints out details of the
1968 production being reduced.  Secondly it runs the code that was included with
1969 the production if any.
1970
1971 This code needs to be able to store data somewhere.  Rather than requiring
1972 `do_reduce` to `malloc` that "somewhere", we pass in a large buffer and have
1973 `do_reduce` return the size to be saved.
1974
1975 In order for the code to access "global" context, we pass in the
1976 "config" pointer that was passed to parser function.  If the `struct
1977 token_config` is embedded in some larger structure, the reducing code
1978 can access the larger structure using pointer manipulation.
1979
1980 The code fragment requires translation when written out.  Any `$N` needs to
1981 be converted to a reference either to that buffer (if `$0`) or to the
1982 structure returned by a previous reduction.  These pointers need to be cast
1983 to the appropriate type for each access.  All this is handling in
1984 `gen_code`.
1985
1986 `gen_code` also allows symbol references to contain a '`<`' as in '`$<2`'.
1987 This applied only to symbols with references (or pointers), not those with structures.
1988 The `<` implies that the reference it being moved out, so the object will not be
1989 automatically freed.  This is equivalent to assigning `NULL` to the pointer.
1990
1991 ###### functions
1992
1993         static void gen_code(struct production *p, FILE *f, struct grammar *g)
1994         {
1995                 char *c;
1996                 char *used = calloc(1, p->body_size);
1997                 int i;
1998
1999                 fprintf(f, "\t\t\t");
2000                 for (c = p->code.txt; c < p->code.txt + p->code.len; c++) {
2001                         int n;
2002                         int use = 0;
2003                         if (*c != '$') {
2004                                 fputc(*c, f);
2005                                 if (*c == '\n')
2006                                         fputs("\t\t\t", f);
2007                                 continue;
2008                         }
2009                         c++;
2010                         if (*c == '<') {
2011                                 use = 1;
2012                                 c++;
2013                         }
2014                         if (*c < '0' || *c > '9') {
2015                                 if (use)
2016                                         fputc('<', f);
2017                                 fputc(*c, f);
2018                                 continue;
2019                         }
2020                         n = *c - '0';
2021                         while (c[1] >= '0' && c[1] <= '9') {
2022                                 c += 1;
2023                                 n = n * 10 + *c - '0';
2024                         }
2025                         if (n == 0)
2026                                 fprintf(f, "(*(struct %.*s*%s)ret)",
2027                                         p->head->struct_name.len,
2028                                         p->head->struct_name.txt,
2029                                         p->head->isref ? "*":"");
2030                         else if (n > p->body_size)
2031                                 fprintf(f, "$%d", n);
2032                         else if (p->body[n-1]->type == Terminal)
2033                                 fprintf(f, "(*(struct token *)body[%d])",
2034                                         n-1);
2035                         else if (p->body[n-1]->struct_name.txt == NULL)
2036                                 fprintf(f, "$%d", n);
2037                         else {
2038                                 fprintf(f, "(*(struct %.*s*%s)body[%d])",
2039                                         p->body[n-1]->struct_name.len,
2040                                         p->body[n-1]->struct_name.txt,
2041                                         p->body[n-1]->isref ? "*":"", n-1);
2042                                 used[n-1] = use;
2043                         }
2044                 }
2045                 fputs("\n", f);
2046                 for (i = 0; i < p->body_size; i++) {
2047                         if (p->body[i]->struct_name.txt &&
2048                             p->body[i]->isref &&
2049                             used[i])
2050                                 // assume this has been copied out
2051                                 fprintf(f, "\t\t*(void**)body[%d] = NULL;\n", i);
2052                 }
2053                 free(used);
2054         }
2055
2056 ###### functions
2057
2058         static void gen_reduce(FILE *f, struct grammar *g, char *file)
2059         {
2060                 int i;
2061                 fprintf(f, "#line 0 \"gen_reduce\"\n");
2062                 fprintf(f, "static int do_reduce(int prod, void **body, struct token_config *config, void *ret)\n");
2063                 fprintf(f, "{\n");
2064                 fprintf(f, "\tint ret_size = 0;\n");
2065
2066                 fprintf(f, "\tswitch(prod) {\n");
2067                 for (i = 0; i < g->production_count; i++) {
2068                         struct production *p = g->productions[i];
2069                         fprintf(f, "\tcase %d:\n", i);
2070
2071                         if (p->code.txt)
2072                                 gen_code(p, f, g);
2073
2074                         if (p->head->struct_name.txt)
2075                                 fprintf(f, "\t\tret_size = sizeof(struct %.*s%s);\n",
2076                                         p->head->struct_name.len,
2077                                         p->head->struct_name.txt,
2078                                         p->head->isref ? "*":"");
2079
2080                         fprintf(f, "\t\tbreak;\n");
2081                 }
2082                 fprintf(f, "\t}\n\treturn ret_size;\n}\n\n");
2083         }
2084
2085 ### `do_free`
2086
2087 As each non-terminal can potentially cause a different type of data
2088 structure to be allocated and filled in, we need to be able to free it when
2089 done.
2090
2091 It is particularly important to have fine control over freeing during error
2092 recovery where individual stack frames might need to be freed.
2093
2094 For this, the grammar author is required to defined a `free_XX` function for
2095 each structure that is used by a non-terminal.  `do_free` will call whichever
2096 is appropriate given a symbol number, and will call `free` (as is
2097 appropriate for tokens on any terminal symbol.
2098
2099 ###### functions
2100
2101         static void gen_free(FILE *f, struct grammar *g)
2102         {
2103                 int i;
2104
2105                 fprintf(f, "#line 0 \"gen_free\"\n");
2106                 fprintf(f, "static void do_free(short sym, void *asn)\n");
2107                 fprintf(f, "{\n");
2108                 fprintf(f, "\tif (!asn) return;\n");
2109                 fprintf(f, "\tif (sym < %d) {\n", g->first_nonterm);
2110                 fprintf(f, "\t\tfree(asn);\n\t\treturn;\n\t}\n");
2111                 fprintf(f, "\tswitch(sym) {\n");
2112
2113                 for (i = 0; i < g->num_syms; i++) {
2114                         struct symbol *s = g->symtab[i];
2115                         if (!s ||
2116                             s->type != Nonterminal ||
2117                             s->struct_name.txt == NULL)
2118                                 continue;
2119
2120                         fprintf(f, "\tcase %d:\n", s->num);
2121                         if (s->isref) {
2122                                 fprintf(f, "\t\tfree_%.*s(*(void**)asn);\n",
2123                                         s->struct_name.len,
2124                                         s->struct_name.txt);
2125                                 fprintf(f, "\t\tfree(asn);\n");
2126                         } else
2127                                 fprintf(f, "\t\tfree_%.*s(asn);\n",
2128                                         s->struct_name.len,
2129                                         s->struct_name.txt);
2130                         fprintf(f, "\t\tbreak;\n");
2131                 }
2132                 fprintf(f, "\t}\n}\n\n");
2133         }
2134
2135 ## The main routine.
2136
2137 There are three key parts to the "main" function of parsergen: processing
2138 the arguments, loading the grammar file, and dealing with the grammar.
2139
2140 ### Argument processing.
2141
2142 Command line options allow the selection of analysis mode, name of output
2143 file, and whether or not a report should be generated.  By default we create
2144 a report only if no code output was requested.
2145
2146 The `parse_XX` function name uses the basename of the output file which
2147 should not have a suffix (`.c`).  `.c` is added to the given name for the
2148 code, and `.h` is added for the header (if header text is specifed in the
2149 grammar file).
2150
2151 ###### includes
2152         #include <getopt.h>
2153
2154 ###### declarations
2155         static const struct option long_options[] = {
2156                 { "LR0",        0, NULL, '0' },
2157                 { "LR05",       0, NULL, '5' },
2158                 { "SLR",        0, NULL, 'S' },
2159                 { "LALR",       0, NULL, 'L' },
2160                 { "LR1",        0, NULL, '1' },
2161                 { "tag",        1, NULL, 't' },
2162                 { "report",     0, NULL, 'R' },
2163                 { "output",     1, NULL, 'o' },
2164                 { NULL,         0, NULL, 0   }
2165         };
2166         const char *options = "05SL1t:Ro:";
2167
2168 ###### process arguments
2169         int opt;
2170         char *outfile = NULL;
2171         char *infile;
2172         char *name;
2173         char *tag = NULL;
2174         int report = 1;
2175         enum grammar_type type = LR05;
2176         while ((opt = getopt_long(argc, argv, options,
2177                                   long_options, NULL)) != -1) {
2178                 switch(opt) {
2179                 case '0':
2180                         type = LR0; break;
2181                 case '5':
2182                         type = LR05; break;
2183                 case 'S':
2184                         type = SLR; break;
2185                 case 'L':
2186                         type = LALR; break;
2187                 case '1':
2188                         type = LR1; break;
2189                 case 'R':
2190                         report = 2; break;
2191                 case 'o':
2192                         outfile = optarg; break;
2193                 case 't':
2194                         tag = optarg; break;
2195                 default:
2196                         fprintf(stderr, "Usage: parsergen ...\n");
2197                         exit(1);
2198                 }
2199         }
2200         if (optind < argc)
2201                 infile = argv[optind++];
2202         else {
2203                 fprintf(stderr, "No input file given\n");
2204                 exit(1);
2205         }
2206         if (outfile && report == 1)
2207                 report = 0;
2208         name = outfile;
2209         if (name && strchr(name, '/'))
2210                 name = strrchr(name, '/')+1;
2211
2212         if (optind < argc) {
2213                 fprintf(stderr, "Excess command line arguments\n");
2214                 exit(1);
2215         }
2216
2217 ### Loading the grammar file
2218
2219 To be able to run `mdcode` and `scanner` on the grammar we need to memory
2220 map it.
2221
2222 One we have extracted the code (with `mdcode`) we expect to find three
2223 sections: header, code, and grammar.  Anything else that is not
2224 excluded by the `--tag` option is an error.
2225
2226 "header" and "code" are optional, though it is hard to build a working
2227 parser with neither. "grammar" must be provided.
2228
2229 ###### includes
2230         #include <fcntl.h>
2231         #include <sys/mman.h>
2232         #include <errno.h>
2233
2234 ###### functions
2235         static int errs;
2236         static void pr_err(char *msg)
2237         {
2238                 errs++;
2239                 fprintf(stderr, "%s\n", msg);
2240         }
2241
2242 ###### load file
2243         struct section *table;
2244         int fd;
2245         int len;
2246         char *file;
2247         fd = open(infile, O_RDONLY);
2248         if (fd < 0) {
2249                 fprintf(stderr, "parsergen: cannot open %s: %s\n",
2250                         infile, strerror(errno));
2251                 exit(1);
2252         }
2253         len = lseek(fd, 0, 2);
2254         file = mmap(NULL, len, PROT_READ, MAP_SHARED, fd, 0);
2255         table = code_extract(file, file+len, pr_err);
2256
2257         struct code_node *hdr = NULL;
2258         struct code_node *code = NULL;
2259         struct code_node *gram = NULL;
2260         for (s = table; s; s = s->next) {
2261                 struct text sec = s->section;
2262                 if (tag && !strip_tag(&sec, tag))
2263                         continue;
2264                 if (text_is(sec, "header"))
2265                         hdr = s->code;
2266                 else if (text_is(sec, "code"))
2267                         code = s->code;
2268                 else if (text_is(sec, "grammar"))
2269                         gram = s->code;
2270                 else {
2271                         fprintf(stderr, "Unknown content section: %.*s\n",
2272                                 s->section.len, s->section.txt);
2273                         rv |= 2;
2274                 }
2275         }
2276
2277 ### Processing the input
2278
2279 As we need to append an extention to a filename and then open it for
2280 writing, and we need to do this twice, it helps to have a separate function.
2281
2282 ###### functions
2283
2284         static FILE *open_ext(char *base, char *ext)
2285         {
2286                 char *fn = malloc(strlen(base) + strlen(ext) + 1);
2287                 FILE *f;
2288                 strcat(strcpy(fn, base), ext);
2289                 f = fopen(fn, "w");
2290                 free(fn);
2291                 return f;
2292         }
2293
2294 If we can read the grammar, then we analyse and optionally report on it.  If
2295 the report finds conflicts we will exit with an error status.
2296
2297 ###### process input
2298         struct grammar *g = NULL;
2299         if (gram == NULL) {
2300                 fprintf(stderr, "No grammar section provided\n");
2301                 rv |= 2;
2302         } else {
2303                 g = grammar_read(gram);
2304                 if (!g) {
2305                         fprintf(stderr, "Failure to parse grammar\n");
2306                         rv |= 2;
2307                 }
2308         }
2309         if (g) {
2310                 grammar_analyse(g, type);
2311                 if (report)
2312                         if (grammar_report(g, type))
2313                                 rv |= 1;
2314         }
2315
2316 If a headers section is defined, we write it out and include a declaration
2317 for the `parse_XX` function so it can be used from separate code.
2318
2319         if (rv == 0 && hdr && outfile) {
2320                 FILE *f = open_ext(outfile, ".h");
2321                 if (f) {
2322                         code_node_print(f, hdr, infile);
2323                         fprintf(f, "void *parse_%s(struct code_node *code, struct token_config *config, FILE *trace);\n",
2324                                 name);
2325                         fclose(f);
2326                 } else {
2327                         fprintf(stderr, "Cannot create %s.h\n",
2328                                 outfile);
2329                         rv |= 4;
2330                 }
2331         }
2332
2333 And if all goes well and an output file was provided, we create the `.c`
2334 file with the code section (if any) and the parser tables and function.
2335
2336         if (rv == 0 && outfile) {
2337                 FILE *f = open_ext(outfile, ".c");
2338                 if (f) {
2339                         if (code)
2340                                 code_node_print(f, code, infile);
2341                         gen_parser(f, g, infile, name);
2342                         fclose(f);
2343                 } else {
2344                         fprintf(stderr, "Cannot create %s.c\n",
2345                                 outfile);
2346                         rv |= 4;
2347                 }
2348         }
2349
2350 And that about wraps it up.  We need to set the locale so that UTF-8 is
2351 recognised properly, and link with `libicuuc` as `libmdcode` requires that.
2352
2353 ###### File: parsergen.mk
2354         parsergen : parsergen.o libscanner.o libmdcode.o
2355                 $(CC) $(CFLAGS) -o parsergen parsergen.o libscanner.o libmdcode.o -licuuc
2356
2357 ###### includes
2358         #include <locale.h>
2359
2360 ###### main
2361
2362         int main(int argc, char *argv[])
2363         {
2364                 struct section *s;
2365                 int rv = 0;
2366
2367                 setlocale(LC_ALL,"");
2368
2369                 ## process arguments
2370                 ## load file
2371                 ## process input
2372
2373                 return rv;
2374         }
2375
2376 ## The SHIFT/REDUCE parser
2377
2378 Having analysed the grammar and generated all the tables, we only need the
2379 shift/reduce engine to bring it all together.
2380
2381 ### Goto table lookup
2382
2383 The parser generator has nicely provided us with goto tables sorted by
2384 symbol number.  We need a binary search function to find a symbol in the
2385 table.
2386
2387 ###### parser functions
2388
2389         static int search(const struct state *l, int sym)
2390         {
2391                 int lo = 0;
2392                 int hi = l->go_to_cnt;
2393
2394                 if (hi == 0)
2395                         return -1;
2396                 while (lo + 1 < hi) {
2397                         int mid = (lo + hi) / 2;
2398                         if (l->go_to[mid].sym <= sym)
2399                                 lo = mid;
2400                         else
2401                                 hi = mid;
2402                 }
2403                 if (l->go_to[lo].sym == sym)
2404                         return l->go_to[lo].state;
2405                 else
2406                         return -1;
2407         }
2408
2409 ### The state stack.
2410
2411 The core data structure for the parser is the stack.  This tracks all the
2412 symbols that have been recognised or partially recognised.
2413
2414 The stack usually won't grow very large - maybe a few tens of entries.  So
2415 we dynamically resize and array as required but never bother to shrink it
2416 down again.
2417
2418 We keep the stack as two separate allocations.  One, `asn_stack` stores the
2419 "abstract syntax nodes" which are created by each reduction.  When we call
2420 `do_reduce` we need to pass an array of the `asn`s of the body of the
2421 production, and by keeping a separate `asn` stack, we can just pass a
2422 pointer into this stack.
2423
2424 The other allocation stores all other stack fields of which there are six.
2425 The `state` is the most important one and guides the parsing process.  The
2426 `sym` is nearly unnecessary.  However when we want to free entries from the
2427 `asn_stack`, it helps to know what type they are so we can call the right
2428 freeing function.  The symbol leads us to the right free function through
2429 `do_free`.
2430
2431 The `indents` count and the `starts_indented` flag track the line
2432 indents in the symbol.  These are used to allow indent information to
2433 guide parsing and error recovery.
2434
2435 `since_newline` tracks how many stack frames since the last
2436 start-of-line (whether indented or not).  So if `since_newline` is
2437 zero, then this symbol is at the start of a line.
2438
2439 `newline_permitted` keeps track of whether newlines should be ignored
2440 or not, and `starts_line` records if this state stated on a newline.
2441
2442 The stack is most properly seen as alternating states and symbols -
2443 states, like the 'DOT' in items, are between symbols.  Each frame in
2444 our stack holds a state and the symbol that was before it.  The
2445 bottom of stack holds the start state, but no symbol, as nothing came
2446 before the beginning.
2447
2448 ###### parser functions
2449
2450         struct parser {
2451                 struct frame {
2452                         short state;
2453                         short newline_permitted;
2454
2455                         short sym;
2456                         short starts_indented;
2457                         short indents;
2458                         short since_newline;
2459                 } *stack;
2460                 void **asn_stack;
2461                 int stack_size;
2462                 int tos;
2463         };
2464
2465 #### Shift and pop
2466
2467 Two operations are needed on the stack - shift (which is like push) and pop.
2468
2469 Shift applies not only to terminals but also to non-terminals.  When we
2470 reduce a production we will pop off entries corresponding to the body
2471 symbols, then push on an item for the head of the production.  This last is
2472 exactly the same process as shifting in a terminal so we use the same
2473 function for both.  In both cases we provide a stack frame which
2474 contains the symbol to shift and related indent information.
2475
2476 To simplify other code we arrange for `shift` to fail if there is no `goto`
2477 state for the symbol.  This is useful in basic parsing due to our design
2478 that we shift when we can, and reduce when we cannot.  So the `shift`
2479 function reports if it could.
2480
2481 `shift` is also used to push state zero onto the stack, so if the
2482 stack is empty, it always chooses zero as the next state.
2483
2484 So `shift` finds the next state.  If that succeed it extends the allocations
2485 if needed and pushes all the information onto the stacks.
2486
2487 Newlines are permitted after a starts_line state until an internal
2488 indent.  So we need to find the topmost state which `starts_line` and
2489 see if there are any indents other than immediately after it.
2490
2491 So we walk down:
2492
2493 -  if state starts_line, then newlines_permitted.
2494 -  if any non-initial indents, newlines not permitted
2495
2496 ###### parser functions
2497
2498         static int shift(struct parser *p, struct frame *next,
2499                          void *asn,
2500                          const struct state states[])
2501         {
2502                 // Push an entry onto the stack
2503                 int newstate = p->tos
2504                         ? search(&states[p->stack[p->tos-1].state],
2505                                  next->sym)
2506                         : 0;
2507                 if (newstate < 0)
2508                         return 0;
2509                 if (p->tos >= p->stack_size) {
2510                         p->stack_size += 10;
2511                         p->stack = realloc(p->stack, p->stack_size
2512                                            * sizeof(p->stack[0]));
2513                         p->asn_stack = realloc(p->asn_stack, p->stack_size
2514                                            * sizeof(p->asn_stack[0]));
2515                 }
2516                 next->state = newstate;
2517                 next->newline_permitted = 0;
2518                 if (p->tos)
2519                         next->newline_permitted =
2520                                 (p->stack[p->tos-1].newline_permitted?:-1)+1;
2521                 if (next->indents > next->starts_indented)
2522                         next->newline_permitted = 0;
2523                 if (next->indents && next->newline_permitted > 2)
2524                         next->newline_permitted = 0;
2525                 if (states[newstate].starts_line)
2526                         next->newline_permitted = 1;
2527                 if (next->since_newline) {
2528                         if (p->tos)
2529                                 next->since_newline = p->stack[p->tos-1].since_newline + 1;
2530                         else
2531                                 next->since_newline = 1;
2532                 }
2533                 p->stack[p->tos] = *next;
2534                 p->asn_stack[p->tos] = asn;
2535                 p->tos++;
2536                 return 1;
2537         }
2538
2539 `pop` primarily moves the top of stack (`tos`) back down the required
2540 amount and frees any `asn` entries that need to be freed.  It also
2541 collects a summary of the indents in the symbols that are being
2542 removed. It is called _after_ we reduce a production, just before we
2543 `shift` the nonterminal in.
2544
2545 `pop` is only called if there are entries to remove, so `num` is never zero.
2546
2547 ###### parser functions
2548
2549         static void pop(struct parser *p, int num, struct frame *next,
2550                         void(*do_free)(short sym, void *asn))
2551         {
2552                 int i;
2553                 p->tos -= num;
2554                 next->starts_indented =
2555                         p->stack[p->tos].starts_indented;
2556                 next->since_newline =
2557                         p->stack[p->tos].since_newline;
2558                 next->indents = 0;
2559                 for (i = 0; i < num; i++) {
2560                         next->indents += p->stack[p->tos+i].indents;
2561                         do_free(p->stack[p->tos+i].sym,
2562                                 p->asn_stack[p->tos+i]);
2563                 }
2564         }
2565
2566 ### Memory allocation
2567
2568 The `scanner` returns tokens in a local variable - we want them in allocated
2569 memory so they can live in the `asn_stack`.  Similarly the `asn` produced by
2570 a reduce is in a large buffer.  Both of these require some allocation and
2571 copying, hence `memdup` and `tokcopy`.
2572
2573 ###### parser includes
2574         #include <memory.h>
2575
2576 ###### parser functions
2577
2578         void *memdup(void *m, int len)
2579         {
2580                 void *ret;
2581                 if (len == 0)
2582                         return NULL;
2583                 ret = malloc(len);
2584                 memcpy(ret, m, len);
2585                 return ret;
2586         }
2587
2588         static struct token *tok_copy(struct token tk)
2589         {
2590                 struct token *new = malloc(sizeof(*new));
2591                 *new = tk;
2592                 return new;
2593         }
2594
2595 ### The heart of the parser.
2596
2597 Now we have the parser.  If we can shift, we do, though newlines and
2598 reducing indenting may block that.  If not and we can reduce we do.
2599 If the production we reduced was production zero, then we have
2600 accepted the input and can finish.
2601
2602 We return whatever `asn` was returned by reducing production zero.
2603
2604 If we can neither shift nor reduce we have an error to handle.  We pop
2605 single entries off the stack until we can shift the `TK_error` symbol, then
2606 drop input tokens until we find one we can shift into the new error state.
2607
2608 When we find `TK_in` and `TK_out` tokens which report indents we need
2609 to handle them directly as the grammar cannot express what we want to
2610 do with them.
2611
2612 `TK_in` tokens are easy: we simply update the `next` stack frame to
2613 record how many indents there are and that the next token started with
2614 an indent.
2615
2616 `TK_out` tokens must either be counted off against any pending indent,
2617 or must force reductions until there is a pending indent which isn't
2618 at the start of a production.
2619
2620 `TK_newline` tokens are ignored precisely if there has been an indent
2621 since the last state which could have been at the start of a line.
2622
2623 ###### parser includes
2624         #include "parser.h"
2625 ###### parser_run
2626         void *parser_run(struct token_state *tokens,
2627                          const struct state states[],
2628                          int (*do_reduce)(int, void**, struct token_config*, void*),
2629                          void (*do_free)(short, void*),
2630                          FILE *trace, const char *non_term[],
2631                          struct token_config *config)
2632         {
2633                 struct parser p = { 0 };
2634                 struct frame next = { 0 };
2635                 struct token *tk = NULL;
2636                 int accepted = 0;
2637                 void *ret = NULL;
2638
2639                 shift(&p, &next, NULL, states);
2640                 while (!accepted) {
2641                         struct token *err_tk;
2642                         struct frame *tos = &p.stack[p.tos-1];
2643                         if (!tk)
2644                                 tk = tok_copy(token_next(tokens));
2645                         next.sym = tk->num;
2646                         parser_trace(trace, &p, &next, tk, states, non_term, config->known_count);
2647
2648                         if (next.sym == TK_in) {
2649                                 next.starts_indented = 1;
2650                                 next.indents = 1;
2651                                 next.since_newline = 0;
2652                                 free(tk);
2653                                 tk = NULL;
2654                                 parser_trace_action(trace, "Record");
2655                                 continue;
2656                         }
2657                         if (next.sym == TK_out) {
2658                                 if (tos->indents > tos->starts_indented ||
2659                                     (tos->indents == 1 &&
2660                                      states[tos->state].reduce_size != 1)) {
2661                                         tos->indents -= 1;
2662                                         if (tos->indents <= tos->starts_indented) {
2663                                                 // no internal indent any more, reassess 'newline_permitted'
2664                                                 if (states[tos->state].starts_line)
2665                                                         tos->newline_permitted = 1;
2666                                                 else if (p.tos > 1)
2667                                                         tos->newline_permitted = (p.stack[p.tos-2].newline_permitted ?:-1)+1;
2668                                         }
2669                                         free(tk);
2670                                         tk = NULL;
2671                                         parser_trace_action(trace, "Cancel");
2672                                         continue;
2673                                 }
2674                                 // fall through and force a REDUCE (as 'shift'
2675                                 // will fail).
2676                         }
2677                         if (next.sym == TK_newline) {
2678                                 if (! tos->newline_permitted) {
2679                                         free(tk);
2680                                         tk = NULL;
2681                                         parser_trace_action(trace, "Discard");
2682                                         continue;
2683                                 }
2684                                 if (states[tos->state].reduce_size > 0 &&
2685                                     states[tos->state].reduce_size < tos->since_newline)
2686                                         goto force_reduce;
2687                         }
2688                         if (shift(&p, &next, tk, states)) {
2689                                 next.since_newline = !(tk->num == TK_newline);
2690                                 next.starts_indented = 0;
2691                                 next.indents = 0;
2692                                 tk = NULL;
2693                                 parser_trace_action(trace, "Shift");
2694                                 continue;
2695                         }
2696                 force_reduce:
2697                         if (states[tos->state].reduce_prod >= 0) {
2698                                 void **body;
2699                                 void *res;
2700                                 const struct state *nextstate = &states[tos->state];
2701                                 int prod = nextstate->reduce_prod;
2702                                 int size = nextstate->reduce_size;
2703                                 int bufsize;
2704                                 static char buf[16*1024];
2705                                 struct frame frame;
2706                                 frame.sym = nextstate->reduce_sym;
2707
2708                                 body = p.asn_stack + (p.tos - size);
2709
2710                                 bufsize = do_reduce(prod, body, config, buf);
2711
2712                                 if (size)
2713                                         pop(&p, size, &frame, do_free);
2714                                 else {
2715                                         frame.indents = next.indents;
2716                                         frame.starts_indented = frame.indents;
2717                                         frame.since_newline = 1;
2718                                         next.indents = 0;
2719                                         next.starts_indented = 0;
2720                                 }
2721                                 res = memdup(buf, bufsize);
2722                                 memset(buf, 0, bufsize);
2723                                 if (!shift(&p, &frame, res, states)) {
2724                                         if (prod != 0) abort();
2725                                         accepted = 1;
2726                                         ret = res;
2727                                 }
2728                                 parser_trace_action(trace, "Reduce");
2729                                 continue;
2730                         }
2731                         if (tk->num == TK_out) {
2732                                 // Indent problem - synthesise tokens to get us
2733                                 // out of here.
2734                                 struct frame frame = { 0 };
2735                                 fprintf(stderr, "Synthesize %d to handle indent problem\n", states[tos->state].shift_sym);
2736                                 frame.sym = states[tos->state].shift_sym;
2737                                 frame.since_newline = 1;
2738                                 shift(&p, &frame, tok_copy(*tk), states);
2739                                 // FIXME need to report this error somehow
2740                                 parser_trace_action(trace, "Synthesize");
2741                                 continue;
2742                         }
2743                         /* Error. We walk up the stack until we
2744                          * find a state which will accept TK_error.
2745                          * We then shift in TK_error and see what state
2746                          * that takes us too.
2747                          * Then we discard input tokens until
2748                          * we find one that is acceptable.
2749                          */
2750                         parser_trace_action(trace, "ERROR");
2751
2752                         err_tk = tok_copy(*tk);
2753                         next.sym = TK_error;
2754                         while (shift(&p, &next, err_tk, states) == 0
2755                                && p.tos > 0)
2756                                 // discard this state
2757                                 pop(&p, 1, &next, do_free);
2758                         if (p.tos == 0) {
2759                                 free(err_tk);
2760                                 // no state accepted TK_error
2761                                 break;
2762                         }
2763                         tos = &p.stack[p.tos-1];
2764                         while (search(&states[tos->state], tk->num) < 0 &&
2765                                tk->num != TK_eof) {
2766                                 free(tk);
2767                                 tk = tok_copy(token_next(tokens));
2768                                 if (tk->num == TK_in)
2769                                         next.indents += 1;
2770                                 if (tk->num == TK_out) {
2771                                         if (next.indents == 0)
2772                                                 break;
2773                                         next.indents -= 1;
2774                                 }
2775                         }
2776                         if (p.tos == 0 && tk->num == TK_eof)
2777                                 break;
2778                 }
2779                 free(tk);
2780                 if (p.tos)
2781                         pop(&p, p.tos, &next, do_free);
2782                 free(p.asn_stack);
2783                 free(p.stack);
2784                 return ret;
2785         }
2786
2787 ###### exported functions
2788         void *parser_run(struct token_state *tokens,
2789                          const struct state states[],
2790                          int (*do_reduce)(int, void**, struct token_config*, void*),
2791                          void (*do_free)(short, void*),
2792                          FILE *trace, const char *non_term[],
2793                          struct token_config *config);
2794
2795 ### Tracing
2796
2797 Being able to visualize the parser in action can be invaluable when
2798 debugging the parser code, or trying to understand how the parse of a
2799 particular grammar progresses.  The stack contains all the important
2800 state, so just printing out the stack every time around the parse loop
2801 can make it possible to see exactly what is happening.
2802
2803 This doesn't explicitly show each SHIFT and REDUCE action.  However they
2804 are easily deduced from the change between consecutive lines, and the
2805 details of each state can be found by cross referencing the states list
2806 in the stack with the "report" that parsergen can generate.
2807
2808 For terminal symbols, we just dump the token.  For non-terminals we
2809 print the name of the symbol.  The look ahead token is reported at the
2810 end inside square brackets.
2811
2812 ###### parser functions
2813
2814         static char *reserved_words[] = {
2815                 [TK_error]        = "ERROR",
2816                 [TK_in]           = "IN",
2817                 [TK_out]          = "OUT",
2818                 [TK_newline]      = "NEWLINE",
2819                 [TK_eof]          = "$eof",
2820         };
2821         static void parser_trace_state(FILE *trace, struct frame *f, const struct state states[])
2822         {
2823                 fprintf(trace, "(%d", f->state);
2824                 if (states[f->state].starts_line)
2825                         fprintf(trace, "s");
2826                 if (f->newline_permitted)
2827                         fprintf(trace, "n%d", f->newline_permitted);
2828                 fprintf(trace, ") ");
2829         }
2830
2831         void parser_trace(FILE *trace, struct parser *p, struct frame *n,
2832                           struct token *tk, const struct state states[],
2833                           const char *non_term[], int knowns)
2834         {
2835                 int i;
2836                 if (!trace)
2837                         return;
2838                 for (i = 0; i < p->tos; i++) {
2839                         struct frame *f = &p->stack[i];
2840                         if (i) {
2841                                 int sym = f->sym;
2842                                 if (sym < TK_reserved &&
2843                                     reserved_words[sym] != NULL)
2844                                         fputs(reserved_words[sym], trace);
2845                                 else if (sym < TK_reserved + knowns) {
2846                                         struct token *t = p->asn_stack[i];
2847                                         text_dump(trace, t->txt, 20);
2848                                 } else
2849                                         fputs(non_term[sym - TK_reserved - knowns],
2850                                               trace);
2851                                 if (f->indents)
2852                                         fprintf(trace, "%c%d", f->starts_indented?':':'.',
2853                                                 f->indents);
2854                                 if (f->since_newline == 0)
2855                                         fputs("/", trace);
2856                                 fputs(" ", trace);
2857                         }
2858                         parser_trace_state(trace, f, states);
2859                 }
2860                 fprintf(trace, "[");
2861                 if (tk->num < TK_reserved &&
2862                     reserved_words[tk->num] != NULL)
2863                         fputs(reserved_words[tk->num], trace);
2864                 else
2865                         text_dump(trace, tk->txt, 20);
2866                 if (n->indents)
2867                         fprintf(trace, "%c%d", n->starts_indented?':':'.',
2868                                 n->indents);
2869                 if (n->since_newline == 0)
2870                         fputs("/", trace);
2871                 fputs("]", trace);
2872         }
2873
2874         void parser_trace_action(FILE *trace, char *action)
2875         {
2876                 if (trace)
2877                         fprintf(trace, " - %s\n", action);
2878         }
2879
2880 # A Worked Example
2881
2882 The obvious example for a parser is a calculator.
2883
2884 As `scanner` provides number parsing function using `libgmp` is it not much
2885 work to perform arbitrary rational number calculations.
2886
2887 This calculator takes one expression, or an equality test per line.  The
2888 results are printed and if any equality test fails, the program exits with
2889 an error.
2890
2891 ###### File: parsergen.mk
2892         calc.c calc.h : parsergen parsergen.mdc
2893                 ./parsergen --tag calc -o calc parsergen.mdc
2894         calc : calc.o libparser.o libscanner.o libmdcode.o libnumber.o
2895                 $(CC) $(CFLAGS) -o calc calc.o libparser.o libscanner.o libmdcode.o libnumber.o -licuuc -lgmp
2896
2897 # calc: header
2898
2899         #include "number.h"
2900         // what do we use for a demo-grammar?  A calculator of course.
2901         struct number {
2902                 mpq_t val;
2903                 char tail[2];
2904                 int err;
2905         };
2906
2907 # calc: code
2908
2909         #include <stdlib.h>
2910         #include <unistd.h>
2911         #include <fcntl.h>
2912         #include <sys/mman.h>
2913         #include <stdio.h>
2914         #include <malloc.h>
2915         #include <gmp.h>
2916         #include "mdcode.h"
2917         #include "scanner.h"
2918         #include "number.h"
2919         #include "parser.h"
2920
2921         #include "calc.h"
2922
2923         static void free_number(struct number *n)
2924         {
2925                 mpq_clear(n->val);
2926                 free(n);
2927         }
2928
2929         int main(int argc, char *argv[])
2930         {
2931                 int fd = open(argv[1], O_RDONLY);
2932                 int len = lseek(fd, 0, 2);
2933                 char *file = mmap(NULL, len, PROT_READ, MAP_SHARED, fd, 0);
2934                 struct section *s = code_extract(file, file+len, NULL);
2935                 struct token_config config = {
2936                         .ignored = (1 << TK_line_comment)
2937                                  | (1 << TK_block_comment)
2938                                  | (1 << TK_in)
2939                                  | (1 << TK_out),
2940                         .number_chars = ".,_+-",
2941                         .word_start = "",
2942                         .word_cont = "",
2943                 };
2944                 parse_calc(s->code, &config, argc > 2 ? stderr : NULL);
2945                 while (s) {
2946                         struct section *t = s->next;
2947                         code_free(s->code);
2948                         free(s);
2949                         s = t;
2950                 }
2951                 exit(0);
2952         }
2953
2954 # calc: grammar
2955
2956         Session -> Session Line
2957                 | Line
2958
2959         Line -> Expression NEWLINE ${ gmp_printf("Answer = %Qd\n", $1.val);
2960                                         { mpf_t fl; mpf_init2(fl, 20); mpf_set_q(fl, $1.val);
2961                                         gmp_printf("  or as a decimal: %Fg\n", fl);
2962                                         mpf_clear(fl);
2963                                         }
2964                                      }$
2965                 | Expression = Expression NEWLINE ${
2966                         if (mpq_equal($1.val, $3.val))
2967                                 gmp_printf("Both equal %Qd\n", $1.val);
2968                         else {
2969                                 gmp_printf("NOT EQUAL: %Qd\n      != : %Qd\n",
2970                                         $1.val, $3.val);
2971                                 exit(1);
2972                         }
2973                 }$
2974                 | NEWLINE ${ printf("Blank line\n"); }$
2975                 | ERROR NEWLINE ${ printf("Skipped a bad line\n"); }$
2976
2977         $number
2978         Expression -> Expression + Term ${ mpq_init($0.val); mpq_add($0.val, $1.val, $3.val); }$
2979                 | Expression - Term ${ mpq_init($0.val); mpq_sub($0.val, $1.val, $3.val); }$
2980                 | Term ${ mpq_init($0.val); mpq_set($0.val, $1.val); }$
2981
2982         Term -> Term * Factor ${ mpq_init($0.val); mpq_mul($0.val, $1.val, $3.val); }$
2983                 | Term / Factor ${ mpq_init($0.val); mpq_div($0.val, $1.val, $3.val); }$
2984                 | Factor ${ mpq_init($0.val); mpq_set($0.val, $1.val); }$
2985
2986         Factor -> NUMBER ${ if (number_parse($0.val, $0.tail, $1.txt) == 0) mpq_init($0.val); }$
2987                 | ( Expression ) ${ mpq_init($0.val); mpq_set($0.val, $2.val); }$