home *** CD-ROM | disk | FTP | other *** search
/ OpenStep 4.2J (Developer) / os42jdev.iso / NextDeveloper / Source / GNU / gcc / bi-parser.y < prev    next >
Text File  |  1995-06-15  |  3KB  |  170 lines

  1. /* Bytecode definition file parser.
  2.    Copyright (C) 1993 Free Software Foundation, Inc.
  3.  
  4. This file is part of GNU CC.
  5.  
  6. GNU CC is free software; you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation; either version 2, or (at your option)
  9. any later version.
  10.  
  11. GNU CC is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. GNU General Public License for more details.
  15.  
  16. You should have received a copy of the GNU General Public License
  17. along with GNU CC; see the file COPYING.  If not, write to
  18. the Free Software Foundation, 59 Temple Place - Suite 330,
  19. Boston, MA 02111-1307, USA.  */
  20.  
  21.  
  22. %{
  23.  
  24. #include <stdio.h>
  25. #include "hconfig.h"
  26. #include "bi-defs.h"
  27.  
  28. extern char yytext[];
  29. extern int yyleng;
  30.  
  31.  
  32. /* Chain of all defs built by the parser. */
  33. struct def *defs;
  34. int ndefs;
  35.  
  36. static struct node *makenode ();
  37. static struct variation *makevar ();
  38. static struct def *makedef ();
  39.  
  40. void yyerror ();
  41.  
  42. %}
  43.  
  44. %union
  45. {
  46.   char *string;
  47.   struct def *def;
  48.   struct variation *variation;
  49.   struct node *node;
  50. }
  51.  
  52. %token <string> DEFOP STRING
  53. %type <string> opt_string
  54. %type <def> defs def
  55. %type <variation> variations variation
  56. %type <node> list items item
  57.  
  58. %%
  59.  
  60. top: 
  61.   defs
  62.     { defs = $1; }
  63.   ;
  64.  
  65. defs:
  66.   def
  67.   | defs def
  68.     { $2->next = $1; $$ = $2; }
  69.   ;
  70.  
  71. def:
  72.   DEFOP '(' STRING ',' opt_string ',' '(' variations ')' ')'
  73.     { $$ = makedef ($3, $5, $8); }
  74.   ;
  75.  
  76. variations:
  77.   variation
  78.   | variations ',' variation
  79.     { $3->next = $1; $$ = $3; }
  80.   ;
  81.  
  82. variation:
  83.   '(' opt_string ')'
  84.     { $$ = makevar ($2, (struct node *) NULL, (struct node *) NULL, (struct node *) NULL); }
  85.   | '(' opt_string ',' list ')'
  86.     { $$ = makevar ($2, $4, (struct node *) NULL, (struct node *) NULL); }
  87.   | '(' opt_string ',' list ',' list ')'
  88.     { $$ = makevar ($2, $4, $6, (struct node *) NULL); }
  89.   | '(' opt_string ',' list ',' list ',' list ')'
  90.     { $$ = makevar ($2, $4, $6, $8); }
  91.   ;
  92.  
  93. opt_string:
  94.   /* empty */ { $$ = ""; }
  95.   | STRING { $$ = $1; }
  96.   ;
  97.  
  98. list:
  99.   '(' items ')'
  100.     { $$ = $2; }
  101.   | /* empty */
  102.     { $$ = NULL; }
  103.   ;
  104.  
  105. items:
  106.   item
  107.   /* Note right recursion. */
  108.   | item ',' items
  109.     { $1->next = $3; $$ = $1; }
  110.   ;
  111.  
  112. item:
  113.   STRING
  114.     { $$ = makenode ($1); }
  115.   ;
  116.  
  117. %%
  118.  
  119. static struct node *
  120. makenode (s)
  121.      char *s;
  122. {
  123.   struct node *n;
  124.  
  125.   n = (struct node *) malloc (sizeof (struct node));
  126.   n->text = s;
  127.   n->next = NULL;
  128.   return n;
  129. }
  130.  
  131. static struct variation *
  132. makevar (name, inputs, outputs, literals)
  133.      char *name;
  134.      struct node *inputs, *outputs, *literals;
  135. {
  136.   struct variation *v;
  137.  
  138.   v = (struct variation *) malloc (sizeof (struct variation));
  139.   v->name = name;
  140.   v->code = ndefs++;
  141.   v->inputs = inputs;
  142.   v->outputs = outputs;
  143.   v->literals = literals;
  144.   v->next = NULL;
  145.   return v;
  146. }
  147.  
  148. static struct def *
  149. makedef (name, template, vars)
  150.      char *name, *template;
  151.      struct variation *vars;
  152. {
  153.   struct def *d;
  154.  
  155.   d = (struct def *) malloc (sizeof (struct def));
  156.   d->basename = name;
  157.   d->template = template;
  158.   d->variations = vars;
  159.   d->next = NULL;
  160.   return d;
  161. }
  162.  
  163. void
  164. yyerror (s)
  165.      char *s;
  166. {
  167.   fprintf (stderr, "syntax error in input\n");
  168.   exit (FATAL_EXIT_CODE);
  169. }
  170.