Home » Recent acquisitions » Acorn ADFS disks » adfs_AcornUser_199512_2.adf » !Regulars » Regulars/StarInfo/Seery/grammar/phrase

Regulars/StarInfo/Seery/grammar/phrase

This website contains an archive of files for the Acorn Electron, BBC Micro, Acorn Archimedes, Commodore 16 and Commodore 64 computers, which Dominic Ford has rescued from his private collection of floppy disks and cassettes.

Some of these files were originally commercial releases in the 1980s and 1990s, but they are now widely available online. I assume that copyright over them is no longer being asserted. If you own the copyright and would like files to be removed, please contact me.

Tape/disk: Home » Recent acquisitions » Acorn ADFS disks » adfs_AcornUser_199512_2.adf » !Regulars
Filename: Regulars/StarInfo/Seery/grammar/phrase
Read OK:
File size: 0DDA bytes
Load address: 0000
Exec address: 0000
File contents
// grammar for 'fittapes' tape fitting system

// for use with 'gb' syntax analyser generator

// ****************************************************************************

// declare tokens

begin
end
video
e480
e360
e240
e180
e120
e60
categories
programme
from
starts
ends
category
precedes
follows
leftBrace
rightBrace
comma
semiColon
identifier
stringLiteral
constant
endOfStream

%%

// define C language interface

#include "fittapes.h"
#include "parser.h"

void yylex()
{
  if (c_lexeme == NULL)
  {
    c_lexeme = lexList_head;
  }
  else
  {
    c_lexeme = c_lexeme->next;
  }
}

int yylextype()
{
  return ((int)c_lexeme->lexeme_type);
}

int yyeof()
{
  return (c_lexeme->lexeme_type == endOfStream);
}

void yyerror(char *string, ...)
{
  va_list argp;

  va_start(argp,string);

  printf("[error]: [line %d of %s] ",c_lexeme->source_line,
  	 c_lexeme->source_file);
  vprintf(string,argp);

  va_end(argp);
}

void yywarning(char *string, ...)
{
  va_list argp;

  va_start(argp,string);

  printf("[warning]: [line %d of %s] ",c_lexeme->source_line,
  	 c_lexeme->source_file);
  vprintf(string,argp);

  va_end(argp);
}

void yyinsert(int number)
{
  Lexeme lex;

  lex = malloc(sizeof(lexeme_instance));
  lex->lexeme_type = number;

  switch (number)
  {
    case identifier:
      lex->lexeme_value.identifierValue = "fittapes";
      break;
    case stringLiteral:
      lex->lexeme_value.stringLiteralValue = "fittapes";
      break;
    case constant:
      lex->lexeme_value.constantValue = 1;
      break;
  }

  lex->source_file = c_lexeme->source_file;
  lex->source_line = c_lexeme->source_line;
  lex->next = c_lexeme;
  lex->prev = c_lexeme->prev;
  if (c_lexeme->prev != NULL)
  {
    c_lexeme->prev->next = lex;
  }
  c_lexeme->prev = lex;
  c_lexeme = lex;
}

%%

// define grammar itself

// distinguished symbol is first listed

input = begin declarations end semiColon .

declarations = video_declaration declarations
| categories_declaration declarations
| programme_declaration declarations
| .

video_declaration = video video_type video_ids semiColon .

video_type = e480 <remember_video_type>
| e360 <remember_video_type>
| e240 <remember_video_type>
| e180 <remember_video_type>
| e120 <remember_video_type>
| e60 <remember_video_type> .

video_ids = identifier <new_video> video_id_list .

video_id_list = comma identifier <new_video> video_id_list
| .

categories_declaration = categories leftBrace category_ids rightBrace semiColon .

category_ids = identifier <new_category> category_id_list .

category_id_list = comma identifier <new_category> category_id_list
| .

programme_declaration = programme <new_programme> leftBrace programme_declarators rightBrace <end_programme> stringLiteral <attach_name> semiColon .

programme_declarators = from_declaration programme_declarators
| start_declaration programme_declarators
| end_declaration programme_declarators
| category_declaration programme_declarators
| precedes_declaration programme_declarators
| follows_declaration programme_declarators
| .

from_declaration = from identifier <attach_source> semiColon .

start_declaration = starts constant <starts_hr> constant <starts_mins> constant <starts_secs> semiColon .

end_declaration = ends constant <ends_hr> constant <ends_mins> constant <ends_secs> semiColon .

category_declaration = category identifier <attach_category> semiColon .

precedes_declaration = precedes stringLiteral <attach_precedes> semiColon .

follows_declaration = follows stringLiteral <attach_follows> semiColon .

%%
00000000  2f 2f 20 67 72 61 6d 6d  61 72 20 66 6f 72 20 27  |// grammar for '|
00000010  66 69 74 74 61 70 65 73  27 20 74 61 70 65 20 66  |fittapes' tape f|
00000020  69 74 74 69 6e 67 20 73  79 73 74 65 6d 0a 0a 2f  |itting system../|
00000030  2f 20 66 6f 72 20 75 73  65 20 77 69 74 68 20 27  |/ for use with '|
00000040  67 62 27 20 73 79 6e 74  61 78 20 61 6e 61 6c 79  |gb' syntax analy|
00000050  73 65 72 20 67 65 6e 65  72 61 74 6f 72 0a 0a 2f  |ser generator../|
00000060  2f 20 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |/ **************|
00000070  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
*
000000a0  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 0a 0a  |**************..|
000000b0  2f 2f 20 64 65 63 6c 61  72 65 20 74 6f 6b 65 6e  |// declare token|
000000c0  73 0a 0a 62 65 67 69 6e  0a 65 6e 64 0a 76 69 64  |s..begin.end.vid|
000000d0  65 6f 0a 65 34 38 30 0a  65 33 36 30 0a 65 32 34  |eo.e480.e360.e24|
000000e0  30 0a 65 31 38 30 0a 65  31 32 30 0a 65 36 30 0a  |0.e180.e120.e60.|
000000f0  63 61 74 65 67 6f 72 69  65 73 0a 70 72 6f 67 72  |categories.progr|
00000100  61 6d 6d 65 0a 66 72 6f  6d 0a 73 74 61 72 74 73  |amme.from.starts|
00000110  0a 65 6e 64 73 0a 63 61  74 65 67 6f 72 79 0a 70  |.ends.category.p|
00000120  72 65 63 65 64 65 73 0a  66 6f 6c 6c 6f 77 73 0a  |recedes.follows.|
00000130  6c 65 66 74 42 72 61 63  65 0a 72 69 67 68 74 42  |leftBrace.rightB|
00000140  72 61 63 65 0a 63 6f 6d  6d 61 0a 73 65 6d 69 43  |race.comma.semiC|
00000150  6f 6c 6f 6e 0a 69 64 65  6e 74 69 66 69 65 72 0a  |olon.identifier.|
00000160  73 74 72 69 6e 67 4c 69  74 65 72 61 6c 0a 63 6f  |stringLiteral.co|
00000170  6e 73 74 61 6e 74 0a 65  6e 64 4f 66 53 74 72 65  |nstant.endOfStre|
00000180  61 6d 0a 0a 25 25 0a 0a  2f 2f 20 64 65 66 69 6e  |am..%%..// defin|
00000190  65 20 43 20 6c 61 6e 67  75 61 67 65 20 69 6e 74  |e C language int|
000001a0  65 72 66 61 63 65 0a 0a  23 69 6e 63 6c 75 64 65  |erface..#include|
000001b0  20 22 66 69 74 74 61 70  65 73 2e 68 22 0a 23 69  | "fittapes.h".#i|
000001c0  6e 63 6c 75 64 65 20 22  70 61 72 73 65 72 2e 68  |nclude "parser.h|
000001d0  22 0a 0a 76 6f 69 64 20  79 79 6c 65 78 28 29 0a  |"..void yylex().|
000001e0  7b 0a 20 20 69 66 20 28  63 5f 6c 65 78 65 6d 65  |{.  if (c_lexeme|
000001f0  20 3d 3d 20 4e 55 4c 4c  29 0a 20 20 7b 0a 20 20  | == NULL).  {.  |
00000200  20 20 63 5f 6c 65 78 65  6d 65 20 3d 20 6c 65 78  |  c_lexeme = lex|
00000210  4c 69 73 74 5f 68 65 61  64 3b 0a 20 20 7d 0a 20  |List_head;.  }. |
00000220  20 65 6c 73 65 0a 20 20  7b 0a 20 20 20 20 63 5f  | else.  {.    c_|
00000230  6c 65 78 65 6d 65 20 3d  20 63 5f 6c 65 78 65 6d  |lexeme = c_lexem|
00000240  65 2d 3e 6e 65 78 74 3b  0a 20 20 7d 0a 7d 0a 0a  |e->next;.  }.}..|
00000250  69 6e 74 20 79 79 6c 65  78 74 79 70 65 28 29 0a  |int yylextype().|
00000260  7b 0a 20 20 72 65 74 75  72 6e 20 28 28 69 6e 74  |{.  return ((int|
00000270  29 63 5f 6c 65 78 65 6d  65 2d 3e 6c 65 78 65 6d  |)c_lexeme->lexem|
00000280  65 5f 74 79 70 65 29 3b  0a 7d 0a 0a 69 6e 74 20  |e_type);.}..int |
00000290  79 79 65 6f 66 28 29 0a  7b 0a 20 20 72 65 74 75  |yyeof().{.  retu|
000002a0  72 6e 20 28 63 5f 6c 65  78 65 6d 65 2d 3e 6c 65  |rn (c_lexeme->le|
000002b0  78 65 6d 65 5f 74 79 70  65 20 3d 3d 20 65 6e 64  |xeme_type == end|
000002c0  4f 66 53 74 72 65 61 6d  29 3b 0a 7d 0a 0a 76 6f  |OfStream);.}..vo|
000002d0  69 64 20 79 79 65 72 72  6f 72 28 63 68 61 72 20  |id yyerror(char |
000002e0  2a 73 74 72 69 6e 67 2c  20 2e 2e 2e 29 0a 7b 0a  |*string, ...).{.|
000002f0  20 20 76 61 5f 6c 69 73  74 20 61 72 67 70 3b 0a  |  va_list argp;.|
00000300  0a 20 20 76 61 5f 73 74  61 72 74 28 61 72 67 70  |.  va_start(argp|
00000310  2c 73 74 72 69 6e 67 29  3b 0a 0a 20 20 70 72 69  |,string);..  pri|
00000320  6e 74 66 28 22 5b 65 72  72 6f 72 5d 3a 20 5b 6c  |ntf("[error]: [l|
00000330  69 6e 65 20 25 64 20 6f  66 20 25 73 5d 20 22 2c  |ine %d of %s] ",|
00000340  63 5f 6c 65 78 65 6d 65  2d 3e 73 6f 75 72 63 65  |c_lexeme->source|
00000350  5f 6c 69 6e 65 2c 0a 20  20 09 20 63 5f 6c 65 78  |_line,.  . c_lex|
00000360  65 6d 65 2d 3e 73 6f 75  72 63 65 5f 66 69 6c 65  |eme->source_file|
00000370  29 3b 0a 20 20 76 70 72  69 6e 74 66 28 73 74 72  |);.  vprintf(str|
00000380  69 6e 67 2c 61 72 67 70  29 3b 0a 0a 20 20 76 61  |ing,argp);..  va|
00000390  5f 65 6e 64 28 61 72 67  70 29 3b 0a 7d 0a 0a 76  |_end(argp);.}..v|
000003a0  6f 69 64 20 79 79 77 61  72 6e 69 6e 67 28 63 68  |oid yywarning(ch|
000003b0  61 72 20 2a 73 74 72 69  6e 67 2c 20 2e 2e 2e 29  |ar *string, ...)|
000003c0  0a 7b 0a 20 20 76 61 5f  6c 69 73 74 20 61 72 67  |.{.  va_list arg|
000003d0  70 3b 0a 0a 20 20 76 61  5f 73 74 61 72 74 28 61  |p;..  va_start(a|
000003e0  72 67 70 2c 73 74 72 69  6e 67 29 3b 0a 0a 20 20  |rgp,string);..  |
000003f0  70 72 69 6e 74 66 28 22  5b 77 61 72 6e 69 6e 67  |printf("[warning|
00000400  5d 3a 20 5b 6c 69 6e 65  20 25 64 20 6f 66 20 25  |]: [line %d of %|
00000410  73 5d 20 22 2c 63 5f 6c  65 78 65 6d 65 2d 3e 73  |s] ",c_lexeme->s|
00000420  6f 75 72 63 65 5f 6c 69  6e 65 2c 0a 20 20 09 20  |ource_line,.  . |
00000430  63 5f 6c 65 78 65 6d 65  2d 3e 73 6f 75 72 63 65  |c_lexeme->source|
00000440  5f 66 69 6c 65 29 3b 0a  20 20 76 70 72 69 6e 74  |_file);.  vprint|
00000450  66 28 73 74 72 69 6e 67  2c 61 72 67 70 29 3b 0a  |f(string,argp);.|
00000460  0a 20 20 76 61 5f 65 6e  64 28 61 72 67 70 29 3b  |.  va_end(argp);|
00000470  0a 7d 0a 0a 76 6f 69 64  20 79 79 69 6e 73 65 72  |.}..void yyinser|
00000480  74 28 69 6e 74 20 6e 75  6d 62 65 72 29 0a 7b 0a  |t(int number).{.|
00000490  20 20 4c 65 78 65 6d 65  20 6c 65 78 3b 0a 0a 20  |  Lexeme lex;.. |
000004a0  20 6c 65 78 20 3d 20 6d  61 6c 6c 6f 63 28 73 69  | lex = malloc(si|
000004b0  7a 65 6f 66 28 6c 65 78  65 6d 65 5f 69 6e 73 74  |zeof(lexeme_inst|
000004c0  61 6e 63 65 29 29 3b 0a  20 20 6c 65 78 2d 3e 6c  |ance));.  lex->l|
000004d0  65 78 65 6d 65 5f 74 79  70 65 20 3d 20 6e 75 6d  |exeme_type = num|
000004e0  62 65 72 3b 0a 0a 20 20  73 77 69 74 63 68 20 28  |ber;..  switch (|
000004f0  6e 75 6d 62 65 72 29 0a  20 20 7b 0a 20 20 20 20  |number).  {.    |
00000500  63 61 73 65 20 69 64 65  6e 74 69 66 69 65 72 3a  |case identifier:|
00000510  0a 20 20 20 20 20 20 6c  65 78 2d 3e 6c 65 78 65  |.      lex->lexe|
00000520  6d 65 5f 76 61 6c 75 65  2e 69 64 65 6e 74 69 66  |me_value.identif|
00000530  69 65 72 56 61 6c 75 65  20 3d 20 22 66 69 74 74  |ierValue = "fitt|
00000540  61 70 65 73 22 3b 0a 20  20 20 20 20 20 62 72 65  |apes";.      bre|
00000550  61 6b 3b 0a 20 20 20 20  63 61 73 65 20 73 74 72  |ak;.    case str|
00000560  69 6e 67 4c 69 74 65 72  61 6c 3a 0a 20 20 20 20  |ingLiteral:.    |
00000570  20 20 6c 65 78 2d 3e 6c  65 78 65 6d 65 5f 76 61  |  lex->lexeme_va|
00000580  6c 75 65 2e 73 74 72 69  6e 67 4c 69 74 65 72 61  |lue.stringLitera|
00000590  6c 56 61 6c 75 65 20 3d  20 22 66 69 74 74 61 70  |lValue = "fittap|
000005a0  65 73 22 3b 0a 20 20 20  20 20 20 62 72 65 61 6b  |es";.      break|
000005b0  3b 0a 20 20 20 20 63 61  73 65 20 63 6f 6e 73 74  |;.    case const|
000005c0  61 6e 74 3a 0a 20 20 20  20 20 20 6c 65 78 2d 3e  |ant:.      lex->|
000005d0  6c 65 78 65 6d 65 5f 76  61 6c 75 65 2e 63 6f 6e  |lexeme_value.con|
000005e0  73 74 61 6e 74 56 61 6c  75 65 20 3d 20 31 3b 0a  |stantValue = 1;.|
000005f0  20 20 20 20 20 20 62 72  65 61 6b 3b 0a 20 20 7d  |      break;.  }|
00000600  0a 0a 20 20 6c 65 78 2d  3e 73 6f 75 72 63 65 5f  |..  lex->source_|
00000610  66 69 6c 65 20 3d 20 63  5f 6c 65 78 65 6d 65 2d  |file = c_lexeme-|
00000620  3e 73 6f 75 72 63 65 5f  66 69 6c 65 3b 0a 20 20  |>source_file;.  |
00000630  6c 65 78 2d 3e 73 6f 75  72 63 65 5f 6c 69 6e 65  |lex->source_line|
00000640  20 3d 20 63 5f 6c 65 78  65 6d 65 2d 3e 73 6f 75  | = c_lexeme->sou|
00000650  72 63 65 5f 6c 69 6e 65  3b 0a 20 20 6c 65 78 2d  |rce_line;.  lex-|
00000660  3e 6e 65 78 74 20 3d 20  63 5f 6c 65 78 65 6d 65  |>next = c_lexeme|
00000670  3b 0a 20 20 6c 65 78 2d  3e 70 72 65 76 20 3d 20  |;.  lex->prev = |
00000680  63 5f 6c 65 78 65 6d 65  2d 3e 70 72 65 76 3b 0a  |c_lexeme->prev;.|
00000690  20 20 69 66 20 28 63 5f  6c 65 78 65 6d 65 2d 3e  |  if (c_lexeme->|
000006a0  70 72 65 76 20 21 3d 20  4e 55 4c 4c 29 0a 20 20  |prev != NULL).  |
000006b0  7b 0a 20 20 20 20 63 5f  6c 65 78 65 6d 65 2d 3e  |{.    c_lexeme->|
000006c0  70 72 65 76 2d 3e 6e 65  78 74 20 3d 20 6c 65 78  |prev->next = lex|
000006d0  3b 0a 20 20 7d 0a 20 20  63 5f 6c 65 78 65 6d 65  |;.  }.  c_lexeme|
000006e0  2d 3e 70 72 65 76 20 3d  20 6c 65 78 3b 0a 20 20  |->prev = lex;.  |
000006f0  63 5f 6c 65 78 65 6d 65  20 3d 20 6c 65 78 3b 0a  |c_lexeme = lex;.|
00000700  7d 0a 0a 25 25 0a 0a 2f  2f 20 64 65 66 69 6e 65  |}..%%..// define|
00000710  20 67 72 61 6d 6d 61 72  20 69 74 73 65 6c 66 0a  | grammar itself.|
00000720  0a 2f 2f 20 64 69 73 74  69 6e 67 75 69 73 68 65  |.// distinguishe|
00000730  64 20 73 79 6d 62 6f 6c  20 69 73 20 66 69 72 73  |d symbol is firs|
00000740  74 20 6c 69 73 74 65 64  0a 0a 69 6e 70 75 74 20  |t listed..input |
00000750  3d 20 62 65 67 69 6e 20  64 65 63 6c 61 72 61 74  |= begin declarat|
00000760  69 6f 6e 73 20 65 6e 64  20 73 65 6d 69 43 6f 6c  |ions end semiCol|
00000770  6f 6e 20 2e 0a 0a 64 65  63 6c 61 72 61 74 69 6f  |on ...declaratio|
00000780  6e 73 20 3d 20 76 69 64  65 6f 5f 64 65 63 6c 61  |ns = video_decla|
00000790  72 61 74 69 6f 6e 20 64  65 63 6c 61 72 61 74 69  |ration declarati|
000007a0  6f 6e 73 0a 7c 20 63 61  74 65 67 6f 72 69 65 73  |ons.| categories|
000007b0  5f 64 65 63 6c 61 72 61  74 69 6f 6e 20 64 65 63  |_declaration dec|
000007c0  6c 61 72 61 74 69 6f 6e  73 0a 7c 20 70 72 6f 67  |larations.| prog|
000007d0  72 61 6d 6d 65 5f 64 65  63 6c 61 72 61 74 69 6f  |ramme_declaratio|
000007e0  6e 20 64 65 63 6c 61 72  61 74 69 6f 6e 73 0a 7c  |n declarations.||
000007f0  20 2e 0a 0a 76 69 64 65  6f 5f 64 65 63 6c 61 72  | ...video_declar|
00000800  61 74 69 6f 6e 20 3d 20  76 69 64 65 6f 20 76 69  |ation = video vi|
00000810  64 65 6f 5f 74 79 70 65  20 76 69 64 65 6f 5f 69  |deo_type video_i|
00000820  64 73 20 73 65 6d 69 43  6f 6c 6f 6e 20 2e 0a 0a  |ds semiColon ...|
00000830  76 69 64 65 6f 5f 74 79  70 65 20 3d 20 65 34 38  |video_type = e48|
00000840  30 20 3c 72 65 6d 65 6d  62 65 72 5f 76 69 64 65  |0 <remember_vide|
00000850  6f 5f 74 79 70 65 3e 0a  7c 20 65 33 36 30 20 3c  |o_type>.| e360 <|
00000860  72 65 6d 65 6d 62 65 72  5f 76 69 64 65 6f 5f 74  |remember_video_t|
00000870  79 70 65 3e 0a 7c 20 65  32 34 30 20 3c 72 65 6d  |ype>.| e240 <rem|
00000880  65 6d 62 65 72 5f 76 69  64 65 6f 5f 74 79 70 65  |ember_video_type|
00000890  3e 0a 7c 20 65 31 38 30  20 3c 72 65 6d 65 6d 62  |>.| e180 <rememb|
000008a0  65 72 5f 76 69 64 65 6f  5f 74 79 70 65 3e 0a 7c  |er_video_type>.||
000008b0  20 65 31 32 30 20 3c 72  65 6d 65 6d 62 65 72 5f  | e120 <remember_|
000008c0  76 69 64 65 6f 5f 74 79  70 65 3e 0a 7c 20 65 36  |video_type>.| e6|
000008d0  30 20 3c 72 65 6d 65 6d  62 65 72 5f 76 69 64 65  |0 <remember_vide|
000008e0  6f 5f 74 79 70 65 3e 20  2e 0a 0a 76 69 64 65 6f  |o_type> ...video|
000008f0  5f 69 64 73 20 3d 20 69  64 65 6e 74 69 66 69 65  |_ids = identifie|
00000900  72 20 3c 6e 65 77 5f 76  69 64 65 6f 3e 20 76 69  |r <new_video> vi|
00000910  64 65 6f 5f 69 64 5f 6c  69 73 74 20 2e 0a 0a 76  |deo_id_list ...v|
00000920  69 64 65 6f 5f 69 64 5f  6c 69 73 74 20 3d 20 63  |ideo_id_list = c|
00000930  6f 6d 6d 61 20 69 64 65  6e 74 69 66 69 65 72 20  |omma identifier |
00000940  3c 6e 65 77 5f 76 69 64  65 6f 3e 20 76 69 64 65  |<new_video> vide|
00000950  6f 5f 69 64 5f 6c 69 73  74 0a 7c 20 2e 0a 0a 63  |o_id_list.| ...c|
00000960  61 74 65 67 6f 72 69 65  73 5f 64 65 63 6c 61 72  |ategories_declar|
00000970  61 74 69 6f 6e 20 3d 20  63 61 74 65 67 6f 72 69  |ation = categori|
00000980  65 73 20 6c 65 66 74 42  72 61 63 65 20 63 61 74  |es leftBrace cat|
00000990  65 67 6f 72 79 5f 69 64  73 20 72 69 67 68 74 42  |egory_ids rightB|
000009a0  72 61 63 65 20 73 65 6d  69 43 6f 6c 6f 6e 20 2e  |race semiColon .|
000009b0  0a 0a 63 61 74 65 67 6f  72 79 5f 69 64 73 20 3d  |..category_ids =|
000009c0  20 69 64 65 6e 74 69 66  69 65 72 20 3c 6e 65 77  | identifier <new|
000009d0  5f 63 61 74 65 67 6f 72  79 3e 20 63 61 74 65 67  |_category> categ|
000009e0  6f 72 79 5f 69 64 5f 6c  69 73 74 20 2e 0a 0a 63  |ory_id_list ...c|
000009f0  61 74 65 67 6f 72 79 5f  69 64 5f 6c 69 73 74 20  |ategory_id_list |
00000a00  3d 20 63 6f 6d 6d 61 20  69 64 65 6e 74 69 66 69  |= comma identifi|
00000a10  65 72 20 3c 6e 65 77 5f  63 61 74 65 67 6f 72 79  |er <new_category|
00000a20  3e 20 63 61 74 65 67 6f  72 79 5f 69 64 5f 6c 69  |> category_id_li|
00000a30  73 74 0a 7c 20 2e 0a 0a  70 72 6f 67 72 61 6d 6d  |st.| ...programm|
00000a40  65 5f 64 65 63 6c 61 72  61 74 69 6f 6e 20 3d 20  |e_declaration = |
00000a50  70 72 6f 67 72 61 6d 6d  65 20 3c 6e 65 77 5f 70  |programme <new_p|
00000a60  72 6f 67 72 61 6d 6d 65  3e 20 6c 65 66 74 42 72  |rogramme> leftBr|
00000a70  61 63 65 20 70 72 6f 67  72 61 6d 6d 65 5f 64 65  |ace programme_de|
00000a80  63 6c 61 72 61 74 6f 72  73 20 72 69 67 68 74 42  |clarators rightB|
00000a90  72 61 63 65 20 3c 65 6e  64 5f 70 72 6f 67 72 61  |race <end_progra|
00000aa0  6d 6d 65 3e 20 73 74 72  69 6e 67 4c 69 74 65 72  |mme> stringLiter|
00000ab0  61 6c 20 3c 61 74 74 61  63 68 5f 6e 61 6d 65 3e  |al <attach_name>|
00000ac0  20 73 65 6d 69 43 6f 6c  6f 6e 20 2e 0a 0a 70 72  | semiColon ...pr|
00000ad0  6f 67 72 61 6d 6d 65 5f  64 65 63 6c 61 72 61 74  |ogramme_declarat|
00000ae0  6f 72 73 20 3d 20 66 72  6f 6d 5f 64 65 63 6c 61  |ors = from_decla|
00000af0  72 61 74 69 6f 6e 20 70  72 6f 67 72 61 6d 6d 65  |ration programme|
00000b00  5f 64 65 63 6c 61 72 61  74 6f 72 73 0a 7c 20 73  |_declarators.| s|
00000b10  74 61 72 74 5f 64 65 63  6c 61 72 61 74 69 6f 6e  |tart_declaration|
00000b20  20 70 72 6f 67 72 61 6d  6d 65 5f 64 65 63 6c 61  | programme_decla|
00000b30  72 61 74 6f 72 73 0a 7c  20 65 6e 64 5f 64 65 63  |rators.| end_dec|
00000b40  6c 61 72 61 74 69 6f 6e  20 70 72 6f 67 72 61 6d  |laration program|
00000b50  6d 65 5f 64 65 63 6c 61  72 61 74 6f 72 73 0a 7c  |me_declarators.||
00000b60  20 63 61 74 65 67 6f 72  79 5f 64 65 63 6c 61 72  | category_declar|
00000b70  61 74 69 6f 6e 20 70 72  6f 67 72 61 6d 6d 65 5f  |ation programme_|
00000b80  64 65 63 6c 61 72 61 74  6f 72 73 0a 7c 20 70 72  |declarators.| pr|
00000b90  65 63 65 64 65 73 5f 64  65 63 6c 61 72 61 74 69  |ecedes_declarati|
00000ba0  6f 6e 20 70 72 6f 67 72  61 6d 6d 65 5f 64 65 63  |on programme_dec|
00000bb0  6c 61 72 61 74 6f 72 73  0a 7c 20 66 6f 6c 6c 6f  |larators.| follo|
00000bc0  77 73 5f 64 65 63 6c 61  72 61 74 69 6f 6e 20 70  |ws_declaration p|
00000bd0  72 6f 67 72 61 6d 6d 65  5f 64 65 63 6c 61 72 61  |rogramme_declara|
00000be0  74 6f 72 73 0a 7c 20 2e  0a 0a 66 72 6f 6d 5f 64  |tors.| ...from_d|
00000bf0  65 63 6c 61 72 61 74 69  6f 6e 20 3d 20 66 72 6f  |eclaration = fro|
00000c00  6d 20 69 64 65 6e 74 69  66 69 65 72 20 3c 61 74  |m identifier <at|
00000c10  74 61 63 68 5f 73 6f 75  72 63 65 3e 20 73 65 6d  |tach_source> sem|
00000c20  69 43 6f 6c 6f 6e 20 2e  0a 0a 73 74 61 72 74 5f  |iColon ...start_|
00000c30  64 65 63 6c 61 72 61 74  69 6f 6e 20 3d 20 73 74  |declaration = st|
00000c40  61 72 74 73 20 63 6f 6e  73 74 61 6e 74 20 3c 73  |arts constant <s|
00000c50  74 61 72 74 73 5f 68 72  3e 20 63 6f 6e 73 74 61  |tarts_hr> consta|
00000c60  6e 74 20 3c 73 74 61 72  74 73 5f 6d 69 6e 73 3e  |nt <starts_mins>|
00000c70  20 63 6f 6e 73 74 61 6e  74 20 3c 73 74 61 72 74  | constant <start|
00000c80  73 5f 73 65 63 73 3e 20  73 65 6d 69 43 6f 6c 6f  |s_secs> semiColo|
00000c90  6e 20 2e 0a 0a 65 6e 64  5f 64 65 63 6c 61 72 61  |n ...end_declara|
00000ca0  74 69 6f 6e 20 3d 20 65  6e 64 73 20 63 6f 6e 73  |tion = ends cons|
00000cb0  74 61 6e 74 20 3c 65 6e  64 73 5f 68 72 3e 20 63  |tant <ends_hr> c|
00000cc0  6f 6e 73 74 61 6e 74 20  3c 65 6e 64 73 5f 6d 69  |onstant <ends_mi|
00000cd0  6e 73 3e 20 63 6f 6e 73  74 61 6e 74 20 3c 65 6e  |ns> constant <en|
00000ce0  64 73 5f 73 65 63 73 3e  20 73 65 6d 69 43 6f 6c  |ds_secs> semiCol|
00000cf0  6f 6e 20 2e 0a 0a 63 61  74 65 67 6f 72 79 5f 64  |on ...category_d|
00000d00  65 63 6c 61 72 61 74 69  6f 6e 20 3d 20 63 61 74  |eclaration = cat|
00000d10  65 67 6f 72 79 20 69 64  65 6e 74 69 66 69 65 72  |egory identifier|
00000d20  20 3c 61 74 74 61 63 68  5f 63 61 74 65 67 6f 72  | <attach_categor|
00000d30  79 3e 20 73 65 6d 69 43  6f 6c 6f 6e 20 2e 0a 0a  |y> semiColon ...|
00000d40  70 72 65 63 65 64 65 73  5f 64 65 63 6c 61 72 61  |precedes_declara|
00000d50  74 69 6f 6e 20 3d 20 70  72 65 63 65 64 65 73 20  |tion = precedes |
00000d60  73 74 72 69 6e 67 4c 69  74 65 72 61 6c 20 3c 61  |stringLiteral <a|
00000d70  74 74 61 63 68 5f 70 72  65 63 65 64 65 73 3e 20  |ttach_precedes> |
00000d80  73 65 6d 69 43 6f 6c 6f  6e 20 2e 0a 0a 66 6f 6c  |semiColon ...fol|
00000d90  6c 6f 77 73 5f 64 65 63  6c 61 72 61 74 69 6f 6e  |lows_declaration|
00000da0  20 3d 20 66 6f 6c 6c 6f  77 73 20 73 74 72 69 6e  | = follows strin|
00000db0  67 4c 69 74 65 72 61 6c  20 3c 61 74 74 61 63 68  |gLiteral <attach|
00000dc0  5f 66 6f 6c 6c 6f 77 73  3e 20 73 65 6d 69 43 6f  |_follows> semiCo|
00000dd0  6c 6f 6e 20 2e 0a 0a 25  25 0a                    |lon ...%%.|
00000dda