diff tests/agcl/oldagsrc/t4xa.syn @ 0:13d2b8934445

Import AnaGram (near-)release tree into Mercurial.
author David A. Holland
date Sat, 22 Dec 2007 17:52:45 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/agcl/oldagsrc/t4xa.syn	Sat Dec 22 17:52:45 2007 -0500
@@ -0,0 +1,905 @@
+[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
+
+