Mercurial > ~dholland > hg > ag > index.cgi
view tests/agcl/oldagsrc/t4xa.syn @ 6:607e3be6bad8
Adjust to the moving target called the C++ standard.
Apparently nowadays it's not allowed to define an explicit copy
constructor but not an assignment operator. Consequently, defining the
explicit copy constructor in terms of the implicit/automatic
assignment operator for general convenience no longer works.
Add assignment operators.
Caution: not tested with the IBM compiler, but there's no particular
reason it shouldn't work.
author | David A. Holland |
---|---|
date | Mon, 30 May 2022 23:46:22 -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