view tests/agcl/oldagsrc/t4xa.syn @ 15:f5acaf0c8a29

Don't cast through "volatile int". Causes a gcc warning nowadays. XXX: should put something else back here to frighten the optimizer
author David A. Holland
date Tue, 31 May 2022 01:00:55 -0400
parents 13d2b8934445
children
line wrap: on
line source

[nest comments]
{
/*
   AnaGram Syntax Analyzer. Copyright (c) Jerome T. Holland, 1989, 1990.
   All Rights Reserved.
*/
  #define PARSE_PROC_DECLARATION parse()
  #define STACK_DEPTH 100
  #define NEXT_TOKEN next_token_11()
/*  #define GET_TOKEN next_token_11() */
  #define GET_TOKEN tkn = tv = (unsigned char) *input_pointer;
  #define ADVANCE_POINTER input_pointer++
  #define TOKEN tkn
  #define TOKEN_VALUE tv
  #define PARSE_STACK_OVERFLOW\
  {fprintf(stderr,"parse stack overflow\n");myabort();}
/*  #define ERROR {syntax_error(); /* return 0; */} */
  #define ERROR {if (TOKEN == eof_tkn) return 0;}
  #define DIAGNOSE diagnose_syntax_error
  #define LINE lines
  #define COLUMN col
  #define TRACK_COLUMN
  #define TRACK_LINE
  #define STACK_COLUMN
  #define STACK_LINE
  #define POINTER input_pointer
  #define BACKTRACK
  #define RESYNCH_EOF eof_tkn
  #define RESYNCH
}

{
  #include "assert.h"
  #include <stdio.h>
  #include <dos.h>
  #include <string.h>
  #include "data.h"
  #include "arrays.h"
  #include "trees.h"
  #include "myalloc.h"
  #include "stk.h"
  #include "pgg18.h"

  typedef enum {PGG18_TOKENS} pgg18_tkns;

  extern unsigned char tkn;
  extern long tv;

  extern string_dict *tkn_dict;
  extern string_dict *param_dict;
  extern string_dict *cast_dict;
  extern tsd *form_table;
  extern tsd *dummy_token_table;
  extern tsd *reducing_proc_table;
  extern tsd *form_length_table;
  extern tsd *bnf_table;
  extern tsd *primary_token_table;
  extern tsd *cast_table;                       /* index of cast list */
  extern tsd *cast_list;                        /* lists cast id's */

  extern tsd *form_base;
  extern tsd *form_item;
  extern tsd *form_length;

  extern FILE *list;
  extern char *input_pointer;
  extern char *input_base;
  extern char *string_base;

extern int partition_required;

node val(int);
char *build_string();
int *build_list();
extern int syntax_error_flag;

}

character set = 0.255\
blank = ' ',
comma = ',' !
digit = '0-9'@
newline = 012 #
carriage return# = 015
letter = 'a-z'  'A-Z' + '_'
letter = 'a-z' + 'A-Z + '_'
letter = 'a+z' + 'A-Z + '_'
tilde = '~"
semicolon = ";'
star = '*'   bar = '|'
colon = ':'
lparen = '('
rparen = ')'
lbrace = '{'
right brace = '}'
squote = '''
dquote = '"'
backslash = '\'
slash = '/'
dollar = '$'
dot = '.'
lbrack = '['
rbrack = ']'
tab = 9
minus = '-'
ampersand = '&'
plus = '+'

eof = 0 + 26 +

anything = ~eof

simple c char = ~(star + '{' + '}' + squote + dquote + slash + eof

c literal elem = ~(squote + dquote + backslash + eof)

[auto resynch]

c char                          //c char represents the content of embedded c
 -> simple c char
 -> slash, ~star & ~eof
 -> star, ~slash & ~eof
 -> c comment
 -> '{', c text, '}'
 -> c literal char, squote
 -> c literal string, dquote

head list names                           //left hand side of productions
 -> name, grammar flag                           = head_list_1(int);
 -> head list names, comma, space, name, grammar flag  = head_list_2(int);

*head list
 -> head list names
 -> head list names, '[', simple space, token parameters, ']', blanks


token parameters,
 -> token parameter, [comma, simple space, token parameter]...
 -> error, ')'

token parameter
 -> name                            =gp1;
 -> name, '=', simple space, name   =gp2;
 -> tilde, simple space, name       =gp1;
 -> name, '=', simple space, tilde, simple space, name   =gp2;
 -> name, '=', simple space, string =gp3;
 -> name, '=', simple space, number =gp1;

grammar flag     $$
 ->                             = flag1;
 -> dollar, blanks              = flag2;


name
 -> {letter = scs(char);},
    [(letter + digit) = acs(char); | mid line white = atbc;...

blanks -> | blanks, mid line white

mid line white
 -> blank
 -> tab
 -> c comment

space -> | space, white

simple space
 -> blanks, comment, blanks]

white
 -> mid line white
 -> comment

end of line
 -> comment, space

comment -> [';'  [~carriage return & ~newline &~eof]...],
  carriage return?, newline
/*
comment -> carriage return?, newline

continuation -> | end of line
*/

continuation = [comment, mid line white?..]

decimal number
 -> '1-9'                       = number_1(int);
 -> decimal number, '0-9'      = number_2(int,int);

octal number
 -> '0'                         = number_1(int);
 -> octal number, '0-'        =number_3(int,int);

hex number
 -> '0', 'x' + 'X'          = number_1(int);
 -> hex number, '0-9'      =number_4(int,int);
 -> hex number, 'A-F'      =number_5(int,int);
 -> hex number, 'a-f'      =number_6(int,int);

number
 -> decimal number
 -> octal number
 -> hex number

range
 -> squote, anything, minus, anything, squote = range(unsigned, unsigned);
 -> squote, anything, dot, anything, squote   = range;
 -> number, blanks, dot, simple space, number        = range;

simple set
 -> range, blanks                       = node ss3;
 -> squote, anything, squote, blanks   = node ss1(unsigned);
 -> number, blanks                     = node ss1(unsigned);
 -> name                                = node ss2;
 -> '(', simple space, union, continuation, ')', blanks = long pass(long);

negation
 -> simple set
 -> tilde, simple space, negation    node make_tilde_node(node)

form element
 -> union      =form_element_1(node);
 -> virtual production


vp form element
 -> name                        =form_element_2//;
// -> '(', simple space, union, continuation, ')',blanks  =form_element_1(node);


intersection
 -> negation
 -> intersection, ampersand, simple space, negation  = node make_and_node(node,node);

union
 -> intersection
 -> union, plus, simple space, intersection     = node make_or_node(node,node);
 -> union, minus, simple space, intersection    = node make_minus_node(node,node);

complete definition
  -> definition, end of line

definition 
 -> name, '=', simple space, union =definition_1(node) ;
 -> name, '=', simple space, virtual production =definition_2(int) ;

parameter flag
 ->                                    = flag1;
 -> star, simple space                        = flag2;

string
 -> {dquote = ics;}, [~dquote & ~eof = acs]..., dquote, blanks

form body
 -> parameter flag, form element, parameter name      = fb1(int, int, int);
 -> form body, comma, simple space, parameter flag,
    form element, parameter name =fb2(int,int,int);

parameter name
 ->                    = pn1;
 -> '\', simple space, c name = pn2;
{
fb1(int flag, int element, int name) {
  pf1(flag, element,name);

}

fb2(int flag, int element, int name) {
  pf2(flag, element,name);
}
pn1()   {return 0;}
pn2() {ids(cvar_dict); return fis();}

}

parametrized form
 -> proper form, '[', simple space, form parameters, ']', blanks

parametrized vp form
 -> proper vp form, '[', simple space, form parameters, ']', blanks

form parameters
 -> form parameter, [comma, simple space, form parameter]...

form parameter
 -> name                            =gp1;
 -> tilde, simple space, name       =gp1;
 -> name, '=', simple space, tilde, simple space, name   =gp2;
 -> name, '=', simple space, name   =gp2;
 -> name, '=', simple space, string =gp3;
 -> name, '=', simple space, number =gp1;

form
 ->               =form1;
 -> form body     =form2;

null form -> =form1;

proper form
 -> form body     =form2;

vp form
 ->               =iws;
 -> form body

proper vp form
 -> form body


proper vp form spec
 -> proper vp form                             =form_spec_4;
 -> proper vp form, '=', simple space, proc spec   =form_spec_3(int);
 -> parametrized vp form =form_spec_4;
 -> parametrized vp form,
     ':', simple space, proc spec   =form_spec_3(int);

mid line action
 -> '!', simple space, proc spec           =mid_line(int);

form spec
/*
 -> form
*/
 -> null form
 -> proper form
 -> null form, ':', simple space, proc spec   =form_spec_2(int,int);
 -> proper form, ':', simple space, proc spec   =form_spec_2(int,int);
 -> parametrized form
 -> parametrized form, 
    ':, simple space, proc spec   =form_spec_2(int,int);

proper form spec 
 -> proper form 
 -> proper form, ':', simple space, proc spec  =form_spec_2(int,int);
 -> parametrized form
 -> parametrized form, 
    :', simple space, proc spec   =form_spec_2(int,int);

proc spec
  -> proc name
  -> proc name, '(', simple space, ')', blanks
  -> proc name, '(', simple space, casts, ')', blanks  = proc_spec_3(int);

  -> proc name, '(', simple space, casts, ')', blanks, embedded c
  -> proc cast, embedded c   =proc_spec_4(int);

proc cast
 ->                                            =pc_1;
 -> '(, simple space, cast, ')', simple space = pc_2;

{
pc_1() {return 0;}
pc_2() { ids(cast_dict); return fis();}
}

/***/
/*
cast
 -> simple name
 -> simple name, mid line white...
 -> simple name, star                        =new_cast_1;
 -> simple name, mid line white..., star     =new_cast_1;
 -> simple name, mid line white..., cast     =new_cast_2;
 -> simple name, mid line white..., star, cast =new_cast_3;
 -> simple name, star, cast                    =new_cast_3;

real space
 -> comment, simple space
 -> mid line white...

cast
 -> simple name
 -> simple name, real space
 -> simple name, star                        =new_cast_1;
 -> simple name, real space, star     =new_cast_1;
 -> simple name, real space, cast     =new_cast_2;
 -> simple name, real space, star, cast =new_cast_3;
 -> simple name, star, cast                    =new_cast_3;
{
new_cast_1() {
  ass(" *");
}
new_cast_2()   {
  its(' ',0);
  concat_string();
}
new_cast_3()   {
  its('*',0);
  new_cast_2();
}
}

proc name
 -> partial proc name   = new_proc_name_4(int);

partial proc name
 -> simple name                            =new_proc_name_1;
 -> simple name, mid line white...         =new_proc_name_1;
 -> simple name, mid line white..., partial proc name = new_proc_name_2(int);
 -> simple name, mid line white..., star, mid line white...,
    partial proc name = new_proc_name_3(int);
 -> simple name, star, mid line white..., partial proc name = new_proc_name_3;
{
new_proc_name_4(int name) {
  ids(cast_dict);
  check_size(map_proc_name, name, 3*name/2);
  map_proc_name[name].cast = fis();
  return name;
}

new_proc_name_1()   {
  int name;

  ids(proc_dict);
  name = fis();
  ics();
  return name;
}
new_proc_name_2(int name)   {
  its(' ',0);
  concat_string();
  return name;
}
new_proc_name_3(int name) {
  its('*',0);
  return new_proc_name_2(name);
}
}

casts
 -> cast                       = new_cast_spec_1;
 -> casts, comma, simple space, cast  = new_cast_spec_2;

{
new_cast_spec_1() {
  ids(cast_dict);
  sws(fis());
}
new_cast_spec_2() {
  ids(cast_dict);
  aws(fis());
}

}

/*****/


/*
proc name
 -> proc cast, c name    :proc_name_1
 -> c name               :proc_name_2
*/
simple name
 -> letter                     =scs(char);
 -> simple name, letter        =acs(char);
 -> simple name, digit         =acs(char);

c name
 -> simple name
 -> c name, blank
/*
star cast
 -> c name, star       =cast_1;
 -> star cast, blank
 -> star cast, star    = cast_2;

cast
 -> c name
 -> star cast

proc cast
 -> c name, blank
 -> star cast

cast spec
 -> cast                    =cast_spec_1;
 -> proc cast, c name       =cast_spec_2;

casts
 -> *cast spec                                       =sws(int);
 -> casts, comma, simple space, *cast spec                  =aws(int);
*/

form specs
 -> form spec                                       =sws(int);
 -> form specs, bar, simple space, proper form spec        =aws(int);

proper form specs
 -> proper form spec                                       =sws(int);
 -> proper form specs, bar, simple space, proper form spec        =aws(int);

vp form specs
 -> proper vp form spec                                  =sws;
 -> vp form specs, bar, simple space, proper vp form spec       =aws;

statement
 -> complete production                  =production(int);
 -> complete definition
 -> complete embedded c
 -> complete precedence grammar
 -> complete global parameter declaration

unterminated statement
 ->
 -> production       =production(int);
 -> definition
 -> embedded c
 -> precedence grammar
 -> global parameter declaration

complete precedence grammar
 -> precedence grammar, end of line

complete global parameter declaration
 -> global parameter declaration, end of line

global parameter declaration
 -> '[', simple space, global parameters, ']', blanks

global parameters
 -> global parameter, [comma, simple space, global parameter]...

global parameter
 -> name                            =gp1;
 -> tilde, simple space, name       =gp1;
 -> name, '=', simple space, tilde, simple space, name   =gp2;
 -> name, '=', simple space, name   =gp2;
 -> name, '=', simple space, string =gp3;
 -> name, '=', simple space, number =gp1;

{
gp1() { ids(param_dict); return fis();}
gp2() { ids(param_dict);fis(); ids(param_dict); fis();}
gp3() { rcs(); ids(param_dict); fis();}
}


precedence grammar
 -> pr_header, end of line?, 
    '{', levels, end of line?, '}' = build_pr_grmr;

pr_header
 -> "%pg", simple space, name, "->", simple space, name =init_prec_grmr;

{
int pr_gram;
int pr_gram_base;
int pr_gram_levels;

typedef enum {la_op, ra_op, pr_op, su_op} op_type;

init_prec_grmr() {
  token_name();
  pr_gram_base = fis();
  token_name();
  pr_gram = fis();
  pr_gram_levels = 0;
}

build_pr_grmr() {
  int *tn, t, i;

  tn = allocate(pr_gram_levels + 1, int);
  t = ntkns + 1;
  ntkns += pr_gram_levels - 1;
  check_size(map_token_number, ntkns, ntkns);
  tn[0] = pr_gram_base;
  tn[pr_gram_levels] = pr_gram;
  map_token_number[pr_gram].non_terminal_flag = 1;
  for (i = 1; i < pr_gram_levels; i++,t++ ) {
    map_token_number[t].non_terminal_flag = 1;
    tn[i] = t;
  }
  while (pr_gram_levels) {
    switch (fis()) {
    case la_op:
      la_op_forms(tn[pr_gram_levels], tn[pr_gram_levels-1]);
      break;
    case ra_op:
      ra_op_forms(tn[pr_gram_levels], tn[pr_gram_levels-1]);
      break;
    case pr_op:
      pr_op_forms(tn[pr_gram_levels], tn[pr_gram_levels-1]);
      break;
    case su_op:
      su_op_forms(tn[pr_gram_levels], tn[pr_gram_levels-1]); 
      break;
    }
    pr_gram_levels--;
  }
}
} 
/*
parameter names
 -> simple name                  =pl1
 -> parameter names, mid line white..., comma, simple space, simple name   =pl2
 -> parameter names, comma, simple space, simple name   =pl2
*/
parameter name list
 ->               =pl4     ;
 -> '\', simple space, parameter names, mid line white..., continuation =pl3;
 -> '\', simple space, parameter names, comment, 
    mid line white?..., continuation =pl3;

single parameter
 ->                                             =pl6;
 -> '\', simple space, simple name, mid line white..., continuation  =pl5;
 -> '\', simple space, simple name, comment, 
    mid line white?..., continuation  =pl5;

parameter names
 -> simple name, mid line white..., comma, simple space, simple name
 -> simple name, comma, simple space, simple name

{
pl1() {ids(cvar_dict); sws(fis());} 
pl2() {ids(cvar_dict); aws(fis());}
pl3() {
  int right;

  ids(cvar_dict); 
  right = fis();
  ids(cvar_dict);
  sis(right);
}
pl4() {sis(0); sis(0);}
pl5() {ids(cvar_dict);}
pl6() {sis(0);}
}
levels
 -> end of line?, level
 -> levels, end of line, level

level
 -> "%bl", simple space, parameter name list, operators  =pg_level_la
 -> "%br", simple space, parameter name list, operators =pg_level_ra;
 -> "%up", simple space, single parameter, operators            =pg_level_pr;
 -> "%us", simple space, single parameter, operators            =pg_level_su

operators
 -> form element  =    la_op_1(int);
 -> form element, '=',
    simple space, proc spec  =la_op_2(int, int);
 -> operators, comma, simple space, form element  =la_op_3(int);
 -> operators, comma, simple space, form element,
    '=', simple space, proc spec  =la_op_4(int, int);
{
pg_level_la() {
  sis(la_op);
  pr_gram_levels++;
}
pg_level_ra() {
  sis(ra_op);
  pr_gram_levels++;
}
pg_level_pr() {
  sis(pr_op);
  pr_gram_levels++;
}
pg_level_su() {
  sis(su_op);
  pr_gram_levels++;
}
la_op_1(int tn) {
  sws(tn); aws(0);
}

la_op_2(int tn,int pn) {
  sws(tn); aws(pn);
}

la_op_3(int tn) {
  aws(tn); aws(0);
}

la_op_4(int tn,int pn) {
  aws(tn); aws(pn);
}

pr_op_forms(int hltn, int lltn) {
  int name;
  token_number_map tm;
  int op, *op_list, i, k, pn,fn;
  int pf;
  int arg;

  op_list = build_list();
  k = fis();
  arg = fis();
  pf1(0,lltn,0);
  fn = form2();
  form_spec_2(fn,0);
  at(bnf_table,hltn,fn);
  map_form_number[fn].prim_tkn = hltn;
  for (i = 0; i< k;) {
    op = op_list[i++];
    pn = op_list[i++];
    pf = (pn && map_proc_name[pn].n_params);
    pf1(0,op,0);
    pf2(pf,hltn,arg);
    fn = form2();
    form_spec_2(fn,pn);
    at(bnf_table,hltn,fn);
    map_form_number[fn].prim_tkn = hltn;
  }
  free(op_list);
}

ra_op_forms(int hltn, int lltn) {
  int name;
  token_number_map tm;
  int op, *op_list, i, k, pn,fn;
  int pf;
  int right, left;

  op_list = build_list();
  k = fis();
  right = fis();
  left = fis();
  pf1(0,lltn,0);
  fn = form2();
  form_spec_2(fn,0);
  at(bnf_table,hltn,fn);
  map_form_number[fn].prim_tkn = hltn;
  for (i = 0; i< k;) {
    op = op_list[i++];
    pn = op_list[i++];
    pf = (pn && map_proc_name[pn].n_params);
    pf1(pf,lltn,left);
    pf2(0,op,0);
    pf2(pf,hltn,right);
    fn = form2();
    form_spec_2(fn,pn);
    at(bnf_table,hltn,fn);
    map_form_number[fn].prim_tkn = hltn;
  }
  free(op_list);
}

su_op_forms(int hltn, int lltn) {
  int name;
  token_number_map tm;
  int op, *op_list, i, k, pn,fn;
  int pf;
  int arg;

  op_list = build_list();
  k = fis();
  arg = fis();
  pf1(0,lltn,0);
  fn = form2();
  form_spec_2(fn,0);
  at(bnf_table,hltn,fn);
  map_form_number[fn].prim_tkn = hltn;
  for (i = 0; i< k;) {
    op = op_list[i++];
    pn = op_list[i++];
    pf = (pn && map_proc_name[pn].n_params);
    pf1(pf,hltn,arg);
    pf2(0,op,0);
    fn = form2();
    form_spec_2(fn,pn);
    at(bnf_table,hltn,fn);
    map_form_number[fn].prim_tkn = hltn;
  }
  free(op_list);
}

la_op_forms(int hltn, int lltn) {
  int name;
  token_number_map tm;
  int op, *op_list, i, k, pn,fn;
  int pf;
  int left,right,type;

  op_list = build_list();
  k = fis();
  right = fis();
  left = fis();
  pf1(0,lltn,0);
  fn = form2();
  form_spec_2(fn,0);
  at(bnf_table,hltn,fn);
  map_form_number[fn].prim_tkn = hltn;
  type = map_token_number[lltn].cast;
  if (type == 0) type = default_token_type;
  for (i = 0; i< k;) {
    op = op_list[i++];
    pn = op_list[i++];
    pf = (pn && map_proc_name[pn].n_params);
    pf1(pf,hltn,left);
    pf2(0,op,0);
    pf2(pf,lltn,right);
    fn = form2();
    form_spec_2(fn,pn);
    if (pn && map_proc_name[pn].auto_proc) finish_proc_def(pn,fn,type);
    at(bnf_table,hltn,fn);
    map_form_number[fn].prim_tkn = hltn;
  }
  free(op_list);
}
}

statement list
 -> space
 -> statement list, statement

file $
 -> statement list, unterminated statement, eof


complete production
 -> production, end of line

production
 -> head list                           =pr1();
 -> head list, "->", blanks, form specs     =pr2;
 -> type definition, head list        =pr3(int);
 -> type definition, head list, "->", blanks, form specs
 -> complete production, "->", blanks, form specs        =pr4(int);

type definition
 -> '(', simple space, cast, ')', simple space             =typedef2;
{
typedef2() {ids(cast_dict); return fis();}
pr1() {iws(); return default_token_type;}
pr2() { return default_token_type;}
pr3(int type) {
  iws();
  return type;
}
pr4(int type) { concat_list(); return type;}

}

virtual production
 -> string      =vp_s;
 -> '{', simple space, vp form specs, '}', blanks         =vp_1;
 -> '{', simple space, vp form specs, '}', "...", blanks  =vp_2;
 -> '[', simple space, vp form specs, ']', blanks         =vp_3;
 -> '[', simple space, vp form specs, ']', "...", blanks  =vp_4;
 -> vp form element, '?', blanks                        =vp_5(int);
 -> vp form element, '?', "...", blanks                 =vp_6(int);
 -> vp form element, "...", blanks                      =vp_7(int);
 -> mid line action                                     =vp_8(int);

complete embedded c
 -> embedded c, end of line
/*
 -> '{', c code, '}', blanks, end of line
*/

embedded c
/* -> '{', c code */
 -> '{', c code, '}', blanks

c code -> c text          = copyoff;

c text
 ->                       = copyon;
 -> c text, c char

{
c comment text
 -> 
 -> c comment text, ~star & ~slash & ~eof
 -> c comment text, slash, ~star & ~eof
 -> c comment text, star, ~slash & ~eof
 -> c comment text, c comment

c comment
 -> slash, star, c comment text, star, slash

c comment 
 -> c comment body, slash

c comment body
 -> c comment text, star
 -> c comment body, star

c comment text
 -> slash, star
 -> c comment text, ~star & ~slash & ~eof 
 -> c comment text, slash, ~star & ~eof 
 -> c comment body, ~star & ~slash & ~eof

c comment text, c comment
 -> c comment text, c comment


c literal string
 -> dquote
 -> c literal string, c literal elem
 -> c literal string, squote
 -> c literal string, backslash, anything

c literal char
 -> squote
 -> c literal char, c literal elem
 -> c literal char, dquote
 -> c literal char, backslash, anything