This is Unofficial EPICS BASE Doxygen Site
reader.c
Go to the documentation of this file.
1 /*************************************************************************\
2 * Copyright (c) 2002 The University of Chicago, as Operator of Argonne
3 * National Laboratory.
4 * Copyright (c) 2002 The Regents of the University of California, as
5 * Operator of Los Alamos National Laboratory.
6 * EPICS BASE is distributed subject to a Software License Agreement found
7 * in file LICENSE that is included with this distribution.
8 \*************************************************************************/
9 #include "defs.h"
10 
11 /* The line size must be a positive integer. One hundred was chosen */
12 /* because few lines in Yacc input grammars exceed 100 characters. */
13 /* Note that if a line exceeds LINESIZE characters, the line buffer */
14 /* will be expanded to accomodate it. */
15 
16 #define LINESIZE 100
17 
18 char *cache;
20 
22 char **tag_table;
23 
25 char *cptr, *line;
27 
29 int prec;
30 int gensym;
32 
35 
38 
40 char *name_pool;
41 
42 char line_format[] = "#line %d \"%s\"\n";
43 
44 #define static
45 
46 static void start_rule(bucket *bp, int s_lineno);
47 
48 
49 static void
50 cachec(int c)
51 {
52  assert(cinc >= 0);
53  if (cinc >= cache_size)
54  {
55  cache_size += 256;
57  if (cache == 0) no_space();
58  }
59  cache[cinc] = c;
60  ++cinc;
61 }
62 
63 
64 static void
65 get_line(void)
66 {
67  FILE *f = input_file;
68  int c;
69  int i;
70 
71  if (saw_eof || (c = getc(f)) == EOF)
72  {
73  if (line) { FREE(line); line = 0; }
74  cptr = 0;
75  saw_eof = 1;
76  return;
77  }
78 
79  if (line == 0 || linesize != (LINESIZE + 1))
80  {
81  if (line) FREE(line);
82  linesize = LINESIZE + 1;
83  line = MALLOC(linesize);
84  if (line == 0) no_space();
85  }
86 
87  i = 0;
88  ++lineno;
89  for (;;)
90  {
91  line[i] = c;
92  if (c == '\n') { cptr = line; return; }
93  if (++i >= linesize)
94  {
95  linesize += LINESIZE;
97  if (line == 0) no_space();
98  }
99  c = getc(f);
100  if (c == EOF)
101  {
102  line[i] = '\n';
103  saw_eof = 1;
104  cptr = line;
105  return;
106  }
107  }
108 }
109 
110 
111 static char *
112 dup_line(void)
113 {
114  char *p, *s, *t;
115 
116  if (line == 0) return (0);
117  s = line;
118  while (*s != '\n') ++s;
119  p = MALLOC(s - line + 1);
120  if (p == 0) no_space();
121 
122  s = line;
123  t = p;
124  while ((*t++ = *s++) != '\n') continue;
125  return (p);
126 }
127 
128 
129 static void
130 skip_comment(void)
131 {
132  char *s;
133 
134  int st_lineno = lineno;
135  char *st_line = dup_line();
136  char *st_cptr = st_line + (cptr - line);
137 
138  s = cptr + 2;
139  for (;;)
140  {
141  if (*s == '*' && s[1] == '/')
142  {
143  cptr = s + 2;
144  FREE(st_line);
145  return;
146  }
147  if (*s == '\n')
148  {
149  get_line();
150  if (line == 0)
151  unterminated_comment(st_lineno, st_line, st_cptr);
152  s = cptr;
153  }
154  else
155  ++s;
156  }
157 }
158 
159 
160 static int
161 nextc(void)
162 {
163  char *s;
164 
165  if (line == 0)
166  {
167  get_line();
168  if (line == 0)
169  return (EOF);
170  }
171 
172  s = cptr;
173  for (;;)
174  {
175  switch (*s)
176  {
177  case '\n':
178  get_line();
179  if (line == 0) return (EOF);
180  s = cptr;
181  break;
182 
183  case ' ':
184  case '\t':
185  case '\f':
186  case '\r':
187  case '\v':
188  case ',':
189  case ';':
190  ++s;
191  break;
192 
193  case '\\':
194  cptr = s;
195  return ('%');
196 
197  case '/':
198  if (s[1] == '*')
199  {
200  cptr = s;
201  skip_comment();
202  s = cptr;
203  break;
204  }
205  else if (s[1] == '/')
206  {
207  get_line();
208  if (line == 0) return (EOF);
209  s = cptr;
210  break;
211  }
212  /* fall through */
213 
214  default:
215  cptr = s;
216  return (*s);
217  }
218  }
219 }
220 
221 
222 static int
223 keyword(void)
224 {
225  int c;
226  char *t_cptr = cptr;
227 
228  c = *++cptr;
229  if (isalpha(c))
230  {
231  cinc = 0;
232  for (;;)
233  {
234  if (isalpha(c))
235  {
236  if (isupper(c)) c = tolower(c);
237  cachec(c);
238  }
239  else if (isdigit(c) || c == '_' || c == '.' || c == '$')
240  cachec(c);
241  else
242  break;
243  c = *++cptr;
244  }
245  cachec(NUL);
246 
247  if (strcmp(cache, "token") == 0 || strcmp(cache, "term") == 0)
248  return (TOKEN);
249  if (strcmp(cache, "type") == 0)
250  return (TYPE);
251  if (strcmp(cache, "left") == 0)
252  return (LEFT);
253  if (strcmp(cache, "right") == 0)
254  return (RIGHT);
255  if (strcmp(cache, "nonassoc") == 0 || strcmp(cache, "binary") == 0)
256  return (NONASSOC);
257  if (strcmp(cache, "start") == 0)
258  return (START);
259  if (strcmp(cache, "union") == 0)
260  return (UNION);
261  if (strcmp(cache, "ident") == 0)
262  return (IDENT);
263  }
264  else
265  {
266  ++cptr;
267  if (c == '{')
268  return (TEXT);
269  if (c == '%' || c == '\\')
270  return (MARK);
271  if (c == '<')
272  return (LEFT);
273  if (c == '>')
274  return (RIGHT);
275  if (c == '0')
276  return (TOKEN);
277  if (c == '2')
278  return (NONASSOC);
279  }
280  syntax_error(lineno, line, t_cptr);
281  /*NOTREACHED*/
282 }
283 
284 
285 static void
286 copy_ident(void)
287 {
288  int c;
289  FILE *f = output_file;
290 
291  c = nextc();
292  if (c == EOF) unexpected_EOF();
293  if (c != '"') syntax_error(lineno, line, cptr);
294  ++outline;
295  fprintf(f, "#ident \"");
296  for (;;)
297  {
298  c = *++cptr;
299  if (c == '\n')
300  {
301  fprintf(f, "\"\n");
302  return;
303  }
304  putc(c, f);
305  if (c == '"')
306  {
307  putc('\n', f);
308  ++cptr;
309  return;
310  }
311  }
312 }
313 
314 
315 static void
316 copy_text(void)
317 {
318  int c;
319  int quote;
320  FILE *f = text_file;
321  int need_newline = 0;
322  int t_lineno = lineno;
323  char *t_line = dup_line();
324  char *t_cptr = t_line + (cptr - line - 2);
325 
326  if (*cptr == '\n')
327  {
328  get_line();
329  if (line == 0)
330  unterminated_text(t_lineno, t_line, t_cptr);
331  }
332  if (!lflag) fprintf(f, line_format, lineno, input_file_name);
333 
334 loop:
335  c = *cptr++;
336  switch (c)
337  {
338  case '\n':
339  next_line:
340  putc('\n', f);
341  need_newline = 0;
342  get_line();
343  if (line) goto loop;
344  unterminated_text(t_lineno, t_line, t_cptr);
345 
346  case '\'':
347  case '"':
348  {
349  int s_lineno = lineno;
350  char *s_line = dup_line();
351  char *s_cptr = s_line + (cptr - line - 1);
352 
353  quote = c;
354  putc(c, f);
355  for (;;)
356  {
357  c = *cptr++;
358  putc(c, f);
359  if (c == quote)
360  {
361  need_newline = 1;
362  FREE(s_line);
363  goto loop;
364  }
365  if (c == '\n')
366  unterminated_string(s_lineno, s_line, s_cptr);
367  if (c == '\\')
368  {
369  c = *cptr++;
370  putc(c, f);
371  if (c == '\n')
372  {
373  get_line();
374  if (line == 0)
375  unterminated_string(s_lineno, s_line, s_cptr);
376  }
377  }
378  }
379  }
380 
381  case '/':
382  putc(c, f);
383  need_newline = 1;
384  c = *cptr;
385  if (c == '/')
386  {
387  putc('*', f);
388  while ((c = *++cptr) != '\n')
389  {
390  if (c == '*' && cptr[1] == '/')
391  fprintf(f, "* ");
392  else
393  putc(c, f);
394  }
395  fprintf(f, "*/");
396  goto next_line;
397  }
398  if (c == '*')
399  {
400  int c_lineno = lineno;
401  char *c_line = dup_line();
402  char *c_cptr = c_line + (cptr - line - 1);
403 
404  putc('*', f);
405  ++cptr;
406  for (;;)
407  {
408  c = *cptr++;
409  putc(c, f);
410  if (c == '*' && *cptr == '/')
411  {
412  putc('/', f);
413  ++cptr;
414  FREE(c_line);
415  goto loop;
416  }
417  if (c == '\n')
418  {
419  get_line();
420  if (line == 0)
421  unterminated_comment(c_lineno, c_line, c_cptr);
422  }
423  }
424  }
425  need_newline = 1;
426  goto loop;
427 
428  case '%':
429  case '\\':
430  if (*cptr == '}')
431  {
432  if (need_newline) putc('\n', f);
433  ++cptr;
434  FREE(t_line);
435  return;
436  }
437  /* fall through */
438 
439  default:
440  putc(c, f);
441  need_newline = 1;
442  goto loop;
443  }
444 }
445 
446 
447 static void
448 copy_union(void)
449 {
450  int c;
451  int quote;
452  int depth;
453  int u_lineno = lineno;
454  char *u_line = dup_line();
455  char *u_cptr = u_line + (cptr - line - 6);
456 
457  if (unionized) over_unionized(cptr - 6);
458  unionized = 1;
459 
460  if (!lflag)
462 
463  fprintf(text_file, "typedef union");
464  if (dflag) fprintf(union_file, "typedef union");
465 
466  depth = 0;
467 loop:
468  c = *cptr++;
469  putc(c, text_file);
470  if (dflag) putc(c, union_file);
471  switch (c)
472  {
473  case '\n':
474  next_line:
475  get_line();
476  if (line == 0) unterminated_union(u_lineno, u_line, u_cptr);
477  goto loop;
478 
479  case '{':
480  ++depth;
481  goto loop;
482 
483  case '}':
484  if (--depth == 0)
485  {
486  fprintf(text_file, " YYSTYPE;\n");
487  FREE(u_line);
488  return;
489  }
490  goto loop;
491 
492  case '\'':
493  case '"':
494  {
495  int s_lineno = lineno;
496  char *s_line = dup_line();
497  char *s_cptr = s_line + (cptr - line - 1);
498 
499  quote = c;
500  for (;;)
501  {
502  c = *cptr++;
503  putc(c, text_file);
504  if (dflag) putc(c, union_file);
505  if (c == quote)
506  {
507  FREE(s_line);
508  goto loop;
509  }
510  if (c == '\n')
511  unterminated_string(s_lineno, s_line, s_cptr);
512  if (c == '\\')
513  {
514  c = *cptr++;
515  putc(c, text_file);
516  if (dflag) putc(c, union_file);
517  if (c == '\n')
518  {
519  get_line();
520  if (line == 0)
521  unterminated_string(s_lineno, s_line, s_cptr);
522  }
523  }
524  }
525  }
526 
527  case '/':
528  c = *cptr;
529  if (c == '/')
530  {
531  putc('*', text_file);
532  if (dflag) putc('*', union_file);
533  while ((c = *++cptr) != '\n')
534  {
535  if (c == '*' && cptr[1] == '/')
536  {
537  fprintf(text_file, "* ");
538  if (dflag) fprintf(union_file, "* ");
539  }
540  else
541  {
542  putc(c, text_file);
543  if (dflag) putc(c, union_file);
544  }
545  }
546  fprintf(text_file, "*/\n");
547  if (dflag) fprintf(union_file, "*/\n");
548  goto next_line;
549  }
550  if (c == '*')
551  {
552  int c_lineno = lineno;
553  char *c_line = dup_line();
554  char *c_cptr = c_line + (cptr - line - 1);
555 
556  putc('*', text_file);
557  if (dflag) putc('*', union_file);
558  ++cptr;
559  for (;;)
560  {
561  c = *cptr++;
562  putc(c, text_file);
563  if (dflag) putc(c, union_file);
564  if (c == '*' && *cptr == '/')
565  {
566  putc('/', text_file);
567  if (dflag) putc('/', union_file);
568  ++cptr;
569  FREE(c_line);
570  goto loop;
571  }
572  if (c == '\n')
573  {
574  get_line();
575  if (line == 0)
576  unterminated_comment(c_lineno, c_line, c_cptr);
577  }
578  }
579  }
580  goto loop;
581 
582  default:
583  goto loop;
584  }
585 }
586 
587 
588 static int
589 hexval(int c)
590 {
591  if (c >= '0' && c <= '9')
592  return (c - '0');
593  if (c >= 'A' && c <= 'F')
594  return (c - 'A' + 10);
595  if (c >= 'a' && c <= 'f')
596  return (c - 'a' + 10);
597  return (-1);
598 }
599 
600 
601 static bucket *
602 get_literal(void)
603 {
604  int c, quote;
605  int i;
606  int n;
607  char *s;
608  bucket *bp;
609  int s_lineno = lineno;
610  char *s_line = dup_line();
611  char *s_cptr = s_line + (cptr - line);
612 
613  quote = *cptr++;
614  cinc = 0;
615  for (;;)
616  {
617  c = *cptr++;
618  if (c == quote) break;
619  if (c == '\n') unterminated_string(s_lineno, s_line, s_cptr);
620  if (c == '\\')
621  {
622  char *c_cptr = cptr - 1;
623 
624  c = *cptr++;
625  switch (c)
626  {
627  case '\n':
628  get_line();
629  if (line == 0) unterminated_string(s_lineno, s_line, s_cptr);
630  continue;
631 
632  case '0': case '1': case '2': case '3':
633  case '4': case '5': case '6': case '7':
634  n = c - '0';
635  c = *cptr;
636  if (IS_OCTAL(c))
637  {
638  n = (n << 3) + (c - '0');
639  c = *++cptr;
640  if (IS_OCTAL(c))
641  {
642  n = (n << 3) + (c - '0');
643  ++cptr;
644  }
645  }
646  if (n > MAXCHAR) illegal_character(c_cptr);
647  c = n;
648  break;
649 
650  case 'x':
651  c = *cptr++;
652  n = hexval(c);
653  if (n < 0 || n >= 16)
654  illegal_character(c_cptr);
655  for (;;)
656  {
657  c = *cptr;
658  i = hexval(c);
659  if (i < 0 || i >= 16) break;
660  ++cptr;
661  n = (n << 4) + i;
662  if (n > MAXCHAR) illegal_character(c_cptr);
663  }
664  c = n;
665  break;
666 
667  case 'a': c = 7; break;
668  case 'b': c = '\b'; break;
669  case 'f': c = '\f'; break;
670  case 'n': c = '\n'; break;
671  case 'r': c = '\r'; break;
672  case 't': c = '\t'; break;
673  case 'v': c = '\v'; break;
674  }
675  }
676  cachec(c);
677  }
678  FREE(s_line);
679 
680  n = cinc;
681  s = MALLOC(n);
682  if (s == 0) no_space();
683 
684  for (i = 0; i < n; ++i)
685  s[i] = cache[i];
686 
687  cinc = 0;
688  if (n == 1)
689  cachec('\'');
690  else
691  cachec('"');
692 
693  for (i = 0; i < n; ++i)
694  {
695  c = ((unsigned char *)s)[i];
696  if (c == '\\' || c == cache[0])
697  {
698  cachec('\\');
699  cachec(c);
700  }
701  else if (isprint(c))
702  cachec(c);
703  else
704  {
705  cachec('\\');
706  switch (c)
707  {
708  case 7: cachec('a'); break;
709  case '\b': cachec('b'); break;
710  case '\f': cachec('f'); break;
711  case '\n': cachec('n'); break;
712  case '\r': cachec('r'); break;
713  case '\t': cachec('t'); break;
714  case '\v': cachec('v'); break;
715  default:
716  cachec(((c >> 6) & 7) + '0');
717  cachec(((c >> 3) & 7) + '0');
718  cachec((c & 7) + '0');
719  break;
720  }
721  }
722  }
723 
724  if (n == 1)
725  cachec('\'');
726  else
727  cachec('"');
728 
729  cachec(NUL);
730  bp = lookup(cache);
731  bp->class = TERM;
732  if (n == 1 && bp->value == UNDEFINED)
733  bp->value = *(unsigned char *)s;
734  FREE(s);
735 
736  return (bp);
737 }
738 
739 
740 static int
741 is_reserved(char *name)
742 {
743  char *s;
744 
745  if (strcmp(name, ".") == 0 ||
746  strcmp(name, "$accept") == 0 ||
747  strcmp(name, "$end") == 0)
748  return (1);
749 
750  if (name[0] == '$' && name[1] == '$' && isdigit((int) name[2]))
751  {
752  s = name + 3;
753  while (isdigit((int) *s)) ++s;
754  if (*s == NUL) return (1);
755  }
756 
757  return (0);
758 }
759 
760 
761 static bucket *
762 get_name(void)
763 {
764  int c;
765 
766  cinc = 0;
767  for (c = *cptr; IS_IDENT(c); c = *++cptr)
768  cachec(c);
769  cachec(NUL);
770 
771  if (is_reserved(cache)) used_reserved(cache);
772 
773  return (lookup(cache));
774 }
775 
776 
777 static int
778 get_number(void)
779 {
780  int c;
781  int n;
782 
783  n = 0;
784  for (c = *cptr; isdigit(c); c = *++cptr)
785  n = 10*n + (c - '0');
786 
787  return (n);
788 }
789 
790 
791 static char *
792 get_tag(void)
793 {
794  int c;
795  int i;
796  char *s;
797  int t_lineno = lineno;
798  char *t_line = dup_line();
799  char *t_cptr = t_line + (cptr - line);
800 
801  ++cptr;
802  c = nextc();
803  if (c == EOF) unexpected_EOF();
804  if (!isalpha(c) && c != '_' && c != '$')
805  illegal_tag(t_lineno, t_line, t_cptr);
806 
807  cinc = 0;
808  do { cachec(c); c = *++cptr; } while (IS_IDENT(c));
809  cachec(NUL);
810 
811  c = nextc();
812  if (c == EOF) unexpected_EOF();
813  if (c != '>')
814  illegal_tag(t_lineno, t_line, t_cptr);
815  ++cptr;
816 
817  for (i = 0; i < ntags; ++i)
818  {
819  if (strcmp(cache, tag_table[i]) == 0)
820  return (tag_table[i]);
821  }
822 
823  if (ntags >= tagmax)
824  {
825  tagmax += 16;
826  tag_table = (char **)
827  (tag_table ? REALLOC(tag_table, tagmax*sizeof(char *))
828  : MALLOC(tagmax*sizeof(char *)));
829  if (tag_table == 0) no_space();
830  }
831 
832  s = MALLOC(cinc);
833  if (s == 0) no_space();
834  strcpy(s, cache);
835  tag_table[ntags] = s;
836  ++ntags;
837  FREE(t_line);
838  return (s);
839 }
840 
841 
842 static void
843 declare_tokens(int assoc)
844 {
845  int c;
846  bucket *bp;
847  int value;
848  char *tag = 0;
849 
850  if (assoc != TOKEN) ++prec;
851 
852  c = nextc();
853  if (c == EOF) unexpected_EOF();
854  if (c == '<')
855  {
856  tag = get_tag();
857  c = nextc();
858  if (c == EOF) unexpected_EOF();
859  }
860 
861  for (;;)
862  {
863  if (isalpha(c) || c == '_' || c == '.' || c == '$')
864  bp = get_name();
865  else if (c == '\'' || c == '"')
866  bp = get_literal();
867  else
868  return;
869 
870  if (bp == goal) tokenized_start(bp->name);
871  bp->class = TERM;
872 
873  if (tag)
874  {
875  if (bp->tag && tag != bp->tag)
876  retyped_warning(bp->name);
877  bp->tag = tag;
878  }
879 
880  if (assoc != TOKEN)
881  {
882  if (bp->prec && prec != bp->prec)
883  reprec_warning(bp->name);
884  bp->assoc = assoc;
885  bp->prec = prec;
886  }
887 
888  c = nextc();
889  if (c == EOF) unexpected_EOF();
890  value = UNDEFINED;
891  if (isdigit(c))
892  {
893  value = get_number();
894  if (bp->value != UNDEFINED && value != bp->value)
895  revalued_warning(bp->name);
896  bp->value = value;
897  c = nextc();
898  if (c == EOF) unexpected_EOF();
899  }
900  }
901 }
902 
903 
904 static void
905 declare_types(void)
906 {
907  int c;
908  bucket *bp;
909  char *tag;
910 
911  c = nextc();
912  if (c == EOF) unexpected_EOF();
913  if (c != '<') syntax_error(lineno, line, cptr);
914  tag = get_tag();
915 
916  for (;;)
917  {
918  c = nextc();
919  if (isalpha(c) || c == '_' || c == '.' || c == '$')
920  bp = get_name();
921  else if (c == '\'' || c == '"')
922  bp = get_literal();
923  else
924  return;
925 
926  if (bp->tag && tag != bp->tag)
927  retyped_warning(bp->name);
928  bp->tag = tag;
929  }
930 }
931 
932 
933 static void
934 declare_start(void)
935 {
936  int c;
937  bucket *bp;
938 
939  c = nextc();
940  if (c == EOF) unexpected_EOF();
941  if (!isalpha(c) && c != '_' && c != '.' && c != '$')
942  syntax_error(lineno, line, cptr);
943  bp = get_name();
944  if (bp->class == TERM)
945  terminal_start(bp->name);
946  if (goal && goal != bp)
948  goal = bp;
949 }
950 
951 
952 static void
953 read_declarations(void)
954 {
955  int c, k;
956 
957  cache_size = 256;
959  if (cache == 0) no_space();
960 
961  for (;;)
962  {
963  c = nextc();
964  if (c == EOF) unexpected_EOF();
965  if (c != '%') syntax_error(lineno, line, cptr);
966  switch (k = keyword())
967  {
968  case MARK:
969  return;
970 
971  case IDENT:
972  copy_ident();
973  break;
974 
975  case TEXT:
976  copy_text();
977  break;
978 
979  case UNION:
980  copy_union();
981  break;
982 
983  case TOKEN:
984  case LEFT:
985  case RIGHT:
986  case NONASSOC:
987  declare_tokens(k);
988  break;
989 
990  case TYPE:
991  declare_types();
992  break;
993 
994  case START:
995  declare_start();
996  break;
997  }
998  }
999 }
1000 
1001 
1002 static void
1003 initialize_grammar(void)
1004 {
1005  nitems = 4;
1006  maxitems = 300;
1007  pitem = (bucket **) MALLOC(maxitems*sizeof(bucket *));
1008  if (pitem == 0) no_space();
1009  pitem[0] = 0;
1010  pitem[1] = 0;
1011  pitem[2] = 0;
1012  pitem[3] = 0;
1013 
1014  nrules = 3;
1015  maxrules = 100;
1016  plhs = (bucket **) MALLOC(maxrules*sizeof(bucket *));
1017  if (plhs == 0) no_space();
1018  plhs[0] = 0;
1019  plhs[1] = 0;
1020  plhs[2] = 0;
1021  rprec = (short *) MALLOC(maxrules*sizeof(short));
1022  if (rprec == 0) no_space();
1023  rprec[0] = 0;
1024  rprec[1] = 0;
1025  rprec[2] = 0;
1026  rassoc = (char *) MALLOC(maxrules*sizeof(char));
1027  if (rassoc == 0) no_space();
1028  rassoc[0] = TOKEN;
1029  rassoc[1] = TOKEN;
1030  rassoc[2] = TOKEN;
1031 }
1032 
1033 
1034 static void
1035 expand_items(void)
1036 {
1037  maxitems += 300;
1038  pitem = (bucket **) REALLOC(pitem, maxitems*sizeof(bucket *));
1039  if (pitem == 0) no_space();
1040 }
1041 
1042 
1043 static void
1044 expand_rules(void)
1045 {
1046  maxrules += 100;
1047  plhs = (bucket **) REALLOC(plhs, maxrules*sizeof(bucket *));
1048  if (plhs == 0) no_space();
1049  rprec = (short *) REALLOC(rprec, maxrules*sizeof(short));
1050  if (rprec == 0) no_space();
1051  rassoc = (char *) REALLOC(rassoc, maxrules*sizeof(char));
1052  if (rassoc == 0) no_space();
1053 }
1054 
1055 
1056 static void
1057 advance_to_start(void)
1058 {
1059  int c;
1060  bucket *bp;
1061  char *s_cptr;
1062  int s_lineno;
1063 
1064  for (;;)
1065  {
1066  c = nextc();
1067  if (c != '%') break;
1068  s_cptr = cptr;
1069  switch (keyword())
1070  {
1071  case MARK:
1072  no_grammar();
1073 
1074  case TEXT:
1075  copy_text();
1076  break;
1077 
1078  case START:
1079  declare_start();
1080  break;
1081 
1082  default:
1083  syntax_error(lineno, line, s_cptr);
1084  }
1085  }
1086 
1087  c = nextc();
1088  if (!isalpha(c) && c != '_' && c != '.' && c != '_')
1089  syntax_error(lineno, line, cptr);
1090  bp = get_name();
1091  if (goal == 0)
1092  {
1093  if (bp->class == TERM)
1094  terminal_start(bp->name);
1095  goal = bp;
1096  }
1097 
1098  s_lineno = lineno;
1099  c = nextc();
1100  if (c == EOF) unexpected_EOF();
1101  if (c != ':') syntax_error(lineno, line, cptr);
1102  start_rule(bp, s_lineno);
1103  ++cptr;
1104 }
1105 
1106 
1107 static void
1108 start_rule(bucket *bp, int s_lineno)
1109 {
1110  if (bp->class == TERM)
1111  terminal_lhs(s_lineno);
1112  bp->class = NONTERM;
1113  if (nrules >= maxrules)
1114  expand_rules();
1115  plhs[nrules] = bp;
1116  rprec[nrules] = UNDEFINED;
1117  rassoc[nrules] = TOKEN;
1118 }
1119 
1120 
1121 static void
1122 end_rule(void)
1123 {
1124  int i;
1125 
1126  if (!last_was_action && plhs[nrules]->tag)
1127  {
1128  for (i = nitems - 1; pitem[i]; --i) continue;
1129  if (pitem[i+1] == 0 || pitem[i+1]->tag != plhs[nrules]->tag)
1131  }
1132 
1133  last_was_action = 0;
1134  if (nitems >= maxitems) expand_items();
1135  pitem[nitems] = 0;
1136  ++nitems;
1137  ++nrules;
1138 }
1139 
1140 
1141 static void
1142 insert_empty_rule(void)
1143 {
1144  bucket *bp, **bpp;
1145 
1146  assert(cache);
1147  sprintf(cache, "$$%d", ++gensym);
1148  bp = make_bucket(cache);
1149  last_symbol->next = bp;
1150  last_symbol = bp;
1151  bp->tag = plhs[nrules]->tag;
1152  bp->class = NONTERM;
1153 
1154  if ((nitems += 2) > maxitems)
1155  expand_items();
1156  bpp = pitem + nitems - 1;
1157  *bpp-- = bp;
1158  while ((bpp[0] = bpp[-1])) --bpp;
1159 
1160  if (++nrules >= maxrules)
1161  expand_rules();
1162  plhs[nrules] = plhs[nrules-1];
1163  plhs[nrules-1] = bp;
1164  rprec[nrules] = rprec[nrules-1];
1165  rprec[nrules-1] = 0;
1166  rassoc[nrules] = rassoc[nrules-1];
1167  rassoc[nrules-1] = TOKEN;
1168 }
1169 
1170 
1171 static void
1172 add_symbol(void)
1173 {
1174  int c;
1175  bucket *bp;
1176  int s_lineno = lineno;
1177 
1178  c = *cptr;
1179  if (c == '\'' || c == '"')
1180  bp = get_literal();
1181  else
1182  bp = get_name();
1183 
1184  c = nextc();
1185  if (c == ':')
1186  {
1187  end_rule();
1188  start_rule(bp, s_lineno);
1189  ++cptr;
1190  return;
1191  }
1192 
1193  if (last_was_action)
1194  insert_empty_rule();
1195  last_was_action = 0;
1196 
1197  if (++nitems > maxitems)
1198  expand_items();
1199  pitem[nitems-1] = bp;
1200 }
1201 
1202 
1203 static void
1204 copy_action(void)
1205 {
1206  int c;
1207  int i, n;
1208  int depth;
1209  int quote;
1210  char *tag;
1211  FILE *f = action_file;
1212  int a_lineno = lineno;
1213  char *a_line = dup_line();
1214  char *a_cptr = a_line + (cptr - line);
1215 
1216  if (last_was_action)
1217  insert_empty_rule();
1218  last_was_action = 1;
1219 
1220  fprintf(f, "case %d:\n", nrules - 2);
1221  if (!lflag)
1222  fprintf(f, line_format, lineno, input_file_name);
1223  if (*cptr == '=') ++cptr;
1224 
1225  n = 0;
1226  for (i = nitems - 1; pitem[i]; --i) ++n;
1227 
1228  depth = 0;
1229 loop:
1230  c = *cptr;
1231  if (c == '$')
1232  {
1233  if (cptr[1] == '<')
1234  {
1235  int d_lineno = lineno;
1236  char *d_line = dup_line();
1237  char *d_cptr = d_line + (cptr - line);
1238 
1239  ++cptr;
1240  tag = get_tag();
1241  c = *cptr;
1242  if (c == '$')
1243  {
1244  fprintf(f, "yyval.%s", tag);
1245  ++cptr;
1246  FREE(d_line);
1247  goto loop;
1248  }
1249  else if (isdigit(c))
1250  {
1251  i = get_number();
1252  if (i > n) dollar_warning(d_lineno, i);
1253  fprintf(f, "yyvsp[%d].%s", i - n, tag);
1254  FREE(d_line);
1255  goto loop;
1256  }
1257  else if (c == '-' && isdigit((int) cptr[1]))
1258  {
1259  ++cptr;
1260  i = -get_number() - n;
1261  fprintf(f, "yyvsp[%d].%s", i, tag);
1262  FREE(d_line);
1263  goto loop;
1264  }
1265  else
1266  dollar_error(d_lineno, d_line, d_cptr);
1267  }
1268  else if (cptr[1] == '$')
1269  {
1270  if (ntags)
1271  {
1272  tag = plhs[nrules]->tag;
1273  if (tag == 0) untyped_lhs();
1274  fprintf(f, "yyval.%s", tag);
1275  }
1276  else
1277  fprintf(f, "yyval");
1278  cptr += 2;
1279  goto loop;
1280  }
1281  else if (isdigit((int) cptr[1]))
1282  {
1283  ++cptr;
1284  i = get_number();
1285  if (ntags)
1286  {
1287  if (i <= 0 || i > n)
1288  unknown_rhs(i);
1289  tag = pitem[nitems + i - n - 1]->tag;
1290  if (tag == 0) untyped_rhs(i, pitem[nitems + i - n - 1]->name);
1291  fprintf(f, "yyvsp[%d].%s", i - n, tag);
1292  }
1293  else
1294  {
1295  if (i > n)
1296  dollar_warning(lineno, i);
1297  fprintf(f, "yyvsp[%d]", i - n);
1298  }
1299  goto loop;
1300  }
1301  else if (cptr[1] == '-')
1302  {
1303  cptr += 2;
1304  i = get_number();
1305  if (ntags)
1306  unknown_rhs(-i);
1307  fprintf(f, "yyvsp[%d]", -i - n);
1308  goto loop;
1309  }
1310  }
1311  if (isalpha(c) || c == '_' || c == '$')
1312  {
1313  do
1314  {
1315  putc(c, f);
1316  c = *++cptr;
1317  } while (isalnum(c) || c == '_' || c == '$');
1318  goto loop;
1319  }
1320  putc(c, f);
1321  ++cptr;
1322  switch (c)
1323  {
1324  case '\n':
1325  next_line:
1326  get_line();
1327  if (line) goto loop;
1328  unterminated_action(a_lineno, a_line, a_cptr);
1329 
1330  case ';':
1331  if (depth > 0) goto loop;
1332  fprintf(f, "\nbreak;\n");
1333  FREE(a_line);
1334  return;
1335 
1336  case '{':
1337  ++depth;
1338  goto loop;
1339 
1340  case '}':
1341  if (--depth > 0) goto loop;
1342  fprintf(f, "\nbreak;\n");
1343  FREE(a_line);
1344  return;
1345 
1346  case '\'':
1347  case '"':
1348  {
1349  int s_lineno = lineno;
1350  char *s_line = dup_line();
1351  char *s_cptr = s_line + (cptr - line - 1);
1352 
1353  quote = c;
1354  for (;;)
1355  {
1356  c = *cptr++;
1357  putc(c, f);
1358  if (c == quote)
1359  {
1360  FREE(s_line);
1361  goto loop;
1362  }
1363  if (c == '\n')
1364  unterminated_string(s_lineno, s_line, s_cptr);
1365  if (c == '\\')
1366  {
1367  c = *cptr++;
1368  putc(c, f);
1369  if (c == '\n')
1370  {
1371  get_line();
1372  if (line == 0)
1373  unterminated_string(s_lineno, s_line, s_cptr);
1374  }
1375  }
1376  }
1377  }
1378 
1379  case '/':
1380  c = *cptr;
1381  if (c == '/')
1382  {
1383  putc('*', f);
1384  while ((c = *++cptr) != '\n')
1385  {
1386  if (c == '*' && cptr[1] == '/')
1387  fprintf(f, "* ");
1388  else
1389  putc(c, f);
1390  }
1391  fprintf(f, "*/\n");
1392  goto next_line;
1393  }
1394  if (c == '*')
1395  {
1396  int c_lineno = lineno;
1397  char *c_line = dup_line();
1398  char *c_cptr = c_line + (cptr - line - 1);
1399 
1400  putc('*', f);
1401  ++cptr;
1402  for (;;)
1403  {
1404  c = *cptr++;
1405  putc(c, f);
1406  if (c == '*' && *cptr == '/')
1407  {
1408  putc('/', f);
1409  ++cptr;
1410  FREE(c_line);
1411  goto loop;
1412  }
1413  if (c == '\n')
1414  {
1415  get_line();
1416  if (line == 0)
1417  unterminated_comment(c_lineno, c_line, c_cptr);
1418  }
1419  }
1420  }
1421  goto loop;
1422 
1423  default:
1424  goto loop;
1425  }
1426 }
1427 
1428 
1429 static int
1430 mark_symbol(void)
1431 {
1432  int c;
1433  bucket *bp;
1434 
1435  c = cptr[1];
1436  if (c == '%' || c == '\\')
1437  {
1438  cptr += 2;
1439  return (1);
1440  }
1441 
1442  if (c == '=')
1443  cptr += 2;
1444  else if ((c == 'p' || c == 'P') &&
1445  ((c = cptr[2]) == 'r' || c == 'R') &&
1446  ((c = cptr[3]) == 'e' || c == 'E') &&
1447  ((c = cptr[4]) == 'c' || c == 'C') &&
1448  ((c = cptr[5], !IS_IDENT(c))))
1449  cptr += 5;
1450  else
1451  syntax_error(lineno, line, cptr);
1452 
1453  c = nextc();
1454  if (isalpha(c) || c == '_' || c == '.' || c == '$')
1455  bp = get_name();
1456  else if (c == '\'' || c == '"')
1457  bp = get_literal();
1458  else
1459  {
1460  syntax_error(lineno, line, cptr);
1461  /*NOTREACHED*/
1462  }
1463 
1464  if (rprec[nrules] != UNDEFINED && bp->prec != rprec[nrules])
1465  prec_redeclared();
1466 
1467  rprec[nrules] = bp->prec;
1468  rassoc[nrules] = bp->assoc;
1469  return (0);
1470 }
1471 
1472 
1473 static void
1474 read_grammar(void)
1475 {
1476  int c;
1477 
1478  initialize_grammar();
1479  advance_to_start();
1480 
1481  for (;;)
1482  {
1483  c = nextc();
1484  if (c == EOF) break;
1485  if (isalpha(c) || c == '_' || c == '.' || c == '$' || c == '\'' ||
1486  c == '"')
1487  add_symbol();
1488  else if (c == '{' || c == '=')
1489  copy_action();
1490  else if (c == '|')
1491  {
1492  end_rule();
1493  start_rule(plhs[nrules-1], 0);
1494  ++cptr;
1495  }
1496  else if (c == '%')
1497  {
1498  if (mark_symbol()) break;
1499  }
1500  else
1501  syntax_error(lineno, line, cptr);
1502  }
1503  end_rule();
1504 }
1505 
1506 
1507 static void
1508 free_tags(void)
1509 {
1510  int i;
1511 
1512  if (tag_table == 0) return;
1513 
1514  for (i = 0; i < ntags; ++i)
1515  {
1516  assert(tag_table[i]);
1517  FREE(tag_table[i]);
1518  }
1519  FREE(tag_table);
1520 }
1521 
1522 
1523 static void
1524 pack_names(void)
1525 {
1526  bucket *bp;
1527  char *p, *s, *t;
1528 
1529  name_pool_size = 13; /* 13 == sizeof("$end") + sizeof("$accept") */
1530  for (bp = first_symbol; bp; bp = bp->next)
1531  name_pool_size += strlen(bp->name) + 1;
1533  if (name_pool == 0) no_space();
1534 
1535  strcpy(name_pool, "$accept");
1536  strcpy(name_pool+8, "$end");
1537  t = name_pool + 13;
1538  for (bp = first_symbol; bp; bp = bp->next)
1539  {
1540  p = t;
1541  s = bp->name;
1542  while ((*t++ = *s++)) continue;
1543  FREE(bp->name);
1544  bp->name = p;
1545  }
1546 }
1547 
1548 
1549 static void
1550 check_symbols(void)
1551 {
1552  bucket *bp;
1553 
1554  if (goal->class == UNKNOWN)
1555  undefined_goal(goal->name);
1556 
1557  for (bp = first_symbol; bp; bp = bp->next)
1558  {
1559  if (bp->class == UNKNOWN)
1560  {
1562  bp->class = TERM;
1563  }
1564  }
1565 }
1566 
1567 
1568 static void
1569 pack_symbols(void)
1570 {
1571  bucket *bp;
1572  bucket **v;
1573  int i, j, k, n;
1574 
1575  nsyms = 2;
1576  ntokens = 1;
1577  for (bp = first_symbol; bp; bp = bp->next)
1578  {
1579  ++nsyms;
1580  if (bp->class == TERM) ++ntokens;
1581  }
1583  nvars = nsyms - ntokens;
1584 
1585  symbol_name = (char **) MALLOC(nsyms*sizeof(char *));
1586  if (symbol_name == 0) no_space();
1587  symbol_value = (short *) MALLOC(nsyms*sizeof(short));
1588  if (symbol_value == 0) no_space();
1589  symbol_prec = (short *) MALLOC(nsyms*sizeof(short));
1590  if (symbol_prec == 0) no_space();
1592  if (symbol_assoc == 0) no_space();
1593 
1594  v = (bucket **) MALLOC(nsyms*sizeof(bucket *));
1595  if (v == 0) no_space();
1596 
1597  v[0] = 0;
1598  v[start_symbol] = 0;
1599 
1600  i = 1;
1601  j = start_symbol + 1;
1602  for (bp = first_symbol; bp; bp = bp->next)
1603  {
1604  if (bp->class == TERM)
1605  v[i++] = bp;
1606  else
1607  v[j++] = bp;
1608  }
1609  assert(i == ntokens && j == nsyms);
1610 
1611  for (i = 1; i < ntokens; ++i)
1612  v[i]->index = i;
1613 
1614  goal->index = start_symbol + 1;
1615  k = start_symbol + 2;
1616  while (++i < nsyms)
1617  if (v[i] != goal)
1618  {
1619  v[i]->index = k;
1620  ++k;
1621  }
1622 
1623  goal->value = 0;
1624  k = 1;
1625  for (i = start_symbol + 1; i < nsyms; ++i)
1626  {
1627  if (v[i] != goal)
1628  {
1629  v[i]->value = k;
1630  ++k;
1631  }
1632  }
1633 
1634  k = 0;
1635  for (i = 1; i < ntokens; ++i)
1636  {
1637  n = v[i]->value;
1638  if (n > 256)
1639  {
1640  for (j = k++; j > 0 && symbol_value[j-1] > n; --j)
1641  symbol_value[j] = symbol_value[j-1];
1642  symbol_value[j] = n;
1643  }
1644  }
1645 
1646  if (v[1]->value == UNDEFINED)
1647  v[1]->value = 256;
1648 
1649  j = 0;
1650  n = 257;
1651  for (i = 2; i < ntokens; ++i)
1652  {
1653  if (v[i]->value == UNDEFINED)
1654  {
1655  while (j < k && n == symbol_value[j])
1656  {
1657  while (++j < k && n == symbol_value[j]) continue;
1658  ++n;
1659  }
1660  v[i]->value = n;
1661  ++n;
1662  }
1663  }
1664 
1665  symbol_name[0] = name_pool + 8;
1666  symbol_value[0] = 0;
1667  symbol_prec[0] = 0;
1668  symbol_assoc[0] = TOKEN;
1669  for (i = 1; i < ntokens; ++i)
1670  {
1671  symbol_name[i] = v[i]->name;
1672  symbol_value[i] = v[i]->value;
1673  symbol_prec[i] = v[i]->prec;
1674  symbol_assoc[i] = v[i]->assoc;
1675  }
1677  symbol_value[start_symbol] = -1;
1680  for (++i; i < nsyms; ++i)
1681  {
1682  k = v[i]->index;
1683  symbol_name[k] = v[i]->name;
1684  symbol_value[k] = v[i]->value;
1685  symbol_prec[k] = v[i]->prec;
1686  symbol_assoc[k] = v[i]->assoc;
1687  }
1688 
1689  FREE(v);
1690 }
1691 
1692 
1693 static void
1694 pack_grammar(void)
1695 {
1696  int i, j;
1697  int assoc, prec;
1698 
1699  ritem = (short *) MALLOC(nitems*sizeof(short));
1700  if (ritem == 0) no_space();
1701  rlhs = (short *) MALLOC(nrules*sizeof(short));
1702  if (rlhs == 0) no_space();
1703  rrhs = (short *) MALLOC((nrules+1)*sizeof(short));
1704  if (rrhs == 0) no_space();
1705  rprec = (short *) REALLOC(rprec, nrules*sizeof(short));
1706  if (rprec == 0) no_space();
1707  rassoc = REALLOC(rassoc, nrules);
1708  if (rassoc == 0) no_space();
1709 
1710  ritem[0] = -1;
1711  ritem[1] = goal->index;
1712  ritem[2] = 0;
1713  ritem[3] = -2;
1714  rlhs[0] = 0;
1715  rlhs[1] = 0;
1716  rlhs[2] = start_symbol;
1717  rrhs[0] = 0;
1718  rrhs[1] = 0;
1719  rrhs[2] = 1;
1720 
1721  j = 4;
1722  for (i = 3; i < nrules; ++i)
1723  {
1724  rlhs[i] = plhs[i]->index;
1725  rrhs[i] = j;
1726  assoc = TOKEN;
1727  prec = 0;
1728  while (pitem[j])
1729  {
1730  ritem[j] = pitem[j]->index;
1731  if (pitem[j]->class == TERM)
1732  {
1733  prec = pitem[j]->prec;
1734  assoc = pitem[j]->assoc;
1735  }
1736  ++j;
1737  }
1738  ritem[j] = -i;
1739  ++j;
1740  if (rprec[i] == UNDEFINED)
1741  {
1742  rprec[i] = prec;
1743  rassoc[i] = assoc;
1744  }
1745  }
1746  rrhs[i] = j;
1747 
1748  FREE(plhs);
1749  FREE(pitem);
1750 }
1751 
1752 
1753 static void
1754 print_grammar(void)
1755 {
1756  int i, j, k;
1757  int spacing = 0;
1758  FILE *f = verbose_file;
1759 
1760  if (!vflag) return;
1761 
1762  k = 1;
1763  for (i = 2; i < nrules; ++i)
1764  {
1765  if (rlhs[i] != rlhs[i-1])
1766  {
1767  if (i != 2) fprintf(f, "\n");
1768  fprintf(f, "%4d %s :", i - 2, symbol_name[rlhs[i]]);
1769  spacing = strlen(symbol_name[rlhs[i]]) + 1;
1770  }
1771  else
1772  {
1773  fprintf(f, "%4d ", i - 2);
1774  j = spacing;
1775  while (--j >= 0) putc(' ', f);
1776  putc('|', f);
1777  }
1778 
1779  while (ritem[k] >= 0)
1780  {
1781  fprintf(f, " %s", symbol_name[ritem[k]]);
1782  ++k;
1783  }
1784  ++k;
1785  putc('\n', f);
1786  }
1787 }
1788 
1789 
1790 void
1791 reader(void)
1792 {
1795  read_declarations();
1796  read_grammar();
1798  free_tags();
1799  pack_names();
1800  check_symbols();
1801  pack_symbols();
1802  pack_grammar();
1803  free_symbols();
1804  print_grammar();
1805 }
void retyped_warning(char *s)
Definition: error.c:173
char ** tag_table
Definition: reader.c:22
bucket * last_symbol
Definition: symtab.c:20
void unexpected_EOF(void) NORETURN
Definition: error.c:39
char * tag
Definition: defs.h:125
char * name_pool
Definition: reader.c:40
FILE * verbose_file
Definition: antelope.c:53
int linesize
Definition: reader.c:26
void illegal_tag(int t_lineno, char *t_line, char *t_cptr) NORETURN
Definition: error.c:135
#define TOKEN
Definition: defs.h:64
#define IDENT
Definition: defs.h:73
FILE * union_file
Definition: antelope.c:50
#define TEXT
Definition: defs.h:69
#define assert(exp)
Declare that a condition should be true.
Definition: epicsAssert.h:70
void used_reserved(char *s) NORETURN
Definition: error.c:155
void unknown_rhs(int i) NORETURN
Definition: error.c:286
#define MALLOC(n)
Definition: defs.h:111
#define quote(v)
int lineno
Definition: antelope.c:33
int i
Definition: scan.c:967
#define TYPE
Definition: defs.h:70
short * rlhs
Definition: antelope.c:68
char * cache
Definition: reader.c:18
void over_unionized(char *u_cptr) NORETURN
Definition: error.c:125
void unterminated_comment(int c_lineno, char *c_line, char *c_cptr) NORETURN
Definition: error.c:85
bucket * make_bucket(char *name)
Definition: symtab.c:40
#define NONTERM
Definition: defs.h:80
void no_grammar(void) NORETURN
Definition: error.c:214
void unterminated_action(int a_lineno, char *a_line, char *a_cptr) NORETURN
Definition: error.c:240
#define UNDEFINED
Definition: defs.h:85
char * name
Definition: defs.h:124
void restarted_warning(void)
Definition: error.c:206
char * rassoc
Definition: antelope.c:71
void tokenized_start(char *s) NORETURN
Definition: error.c:164
int gensym
Definition: reader.c:30
char * banner[]
Definition: skeleton.c:19
bucket ** pitem
Definition: reader.c:34
bucket * lookup(char *name)
Definition: symtab.c:66
void undefined_goal(char *s) NORETURN
Definition: error.c:303
int ntags
Definition: reader.c:21
#define NUL
Definition: defs.h:41
void illegal_character(char *c_cptr) NORETURN
Definition: error.c:145
int nrules
Definition: antelope.c:56
#define UNKNOWN
Definition: defs.h:78
#define TERM
Definition: defs.h:79
int nitems
Definition: antelope.c:55
#define NONASSOC
Definition: defs.h:67
int nsyms
Definition: antelope.c:57
#define LINESIZE
Definition: reader.c:16
void untyped_lhs(void) NORETURN
Definition: error.c:268
void write_section(char *section[])
Definition: skeleton.c:284
short prec
Definition: defs.h:128
void revalued_warning(char *s)
Definition: error.c:189
int cinc
Definition: reader.c:19
int nvars
Definition: antelope.c:59
FILE * text_file
Definition: antelope.c:48
char * line
Definition: reader.c:25
void reader(void)
Definition: reader.c:1791
char dflag
Definition: antelope.c:22
short * symbol_value
Definition: antelope.c:63
bucket * first_symbol
Definition: symtab.c:19
#define IS_IDENT(c)
Definition: defs.h:96
bucket ** plhs
Definition: reader.c:37
void prec_redeclared(void)
Definition: error.c:232
void terminal_lhs(int s_lineno) NORETURN
Definition: error.c:223
void dollar_error(int a_lineno, char *a_line, char *a_cptr) NORETURN
Definition: error.c:258
int maxitems
Definition: reader.c:33
void free_symbols(void)
Definition: symtab.c:117
short value
Definition: lalr.c:15
int cache_size
Definition: reader.c:19
short * ritem
Definition: antelope.c:67
char class
Definition: defs.h:129
short * symbol_prec
Definition: antelope.c:64
void default_action_warning(void)
Definition: error.c:295
#define LEFT
Definition: defs.h:65
char unionized
Definition: reader.c:24
void untyped_rhs(int i, char *s) NORETURN
Definition: error.c:277
char saw_eof
Definition: reader.c:24
#define RIGHT
Definition: defs.h:66
short index
Definition: defs.h:127
#define FREE(x)
Definition: defs.h:110
int start_symbol
Definition: antelope.c:61
int name_pool_size
Definition: reader.c:39
#define MARK
Definition: defs.h:68
void create_symbol_table(void)
Definition: symtab.c:88
short * rrhs
Definition: antelope.c:69
char vflag
Definition: antelope.c:26
int tagmax
Definition: reader.c:21
struct bucket * next
Definition: defs.h:123
void dollar_warning(int a_lineno, int i)
Definition: error.c:250
void reprec_warning(char *s)
Definition: error.c:181
#define UNION
Definition: defs.h:72
FILE * output_file
Definition: antelope.c:47
FILE * action_file
Definition: antelope.c:42
bucket * goal
Definition: reader.c:28
#define MAXCHAR
Definition: defs.h:29
int ntokens
Definition: antelope.c:58
void unterminated_string(int s_lineno, char *s_line, char *s_cptr) NORETURN
Definition: error.c:95
short value
Definition: defs.h:126
char * symbol_assoc
Definition: antelope.c:65
void free_symbol_table(void)
Definition: symtab.c:109
char ** symbol_name
Definition: antelope.c:62
void no_space(void) NORETURN
Definition: error.c:23
void unterminated_union(int u_lineno, char *u_line, char *u_cptr) NORETURN
Definition: error.c:115
short * rprec
Definition: antelope.c:70
char line_format[]
Definition: reader.c:42
int prec
Definition: reader.c:29
char assoc
Definition: defs.h:130
char lflag
Definition: antelope.c:23
void terminal_start(char *s)
Definition: error.c:197
void undefined_symbol_warning(char *s)
Definition: error.c:311
void syntax_error(int st_lineno, char *st_line, char *st_cptr) NORETURN
Definition: error.c:75
#define IS_OCTAL(c)
Definition: defs.h:97
char * input_file_name
Definition: antelope.c:38
char last_was_action
Definition: reader.c:31
int maxrules
Definition: reader.c:36
Internal: Hash table structure.
Definition: bucketLib.h:48
void unterminated_text(int t_lineno, char *t_line, char *t_cptr) NORETURN
Definition: error.c:105
#define START
Definition: defs.h:71
int outline
Definition: antelope.c:34
#define REALLOC(p, n)
Definition: defs.h:114
char * cptr
Definition: reader.c:25
FILE * input_file
Definition: antelope.c:46