diff options
author | Niklas Hallqvist <niklas@cvs.openbsd.org> | 1995-12-20 01:06:22 +0000 |
---|---|---|
committer | Niklas Hallqvist <niklas@cvs.openbsd.org> | 1995-12-20 01:06:22 +0000 |
commit | c482518380683ee38d14024c1e362a0d681cf967 (patch) | |
tree | e69b4f6d3fee3aced20a41f3fdf543fc1c77fb5d /gnu/usr.bin/gcc/bi-parser.y | |
parent | 76a62188d0db49c65b696d474c855a799fd96dce (diff) |
FSF GCC version 2.7.2
Diffstat (limited to 'gnu/usr.bin/gcc/bi-parser.y')
-rw-r--r-- | gnu/usr.bin/gcc/bi-parser.y | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/gnu/usr.bin/gcc/bi-parser.y b/gnu/usr.bin/gcc/bi-parser.y new file mode 100644 index 00000000000..0a03d0f05ad --- /dev/null +++ b/gnu/usr.bin/gcc/bi-parser.y @@ -0,0 +1,169 @@ +/* Bytecode definition file parser. + Copyright (C) 1993 Free Software Foundation, Inc. + +This file is part of GNU CC. + +GNU CC is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU CC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GNU CC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + + +%{ + +#include <stdio.h> +#include "hconfig.h" +#include "bi-defs.h" + +extern char yytext[]; +extern int yyleng; + + +/* Chain of all defs built by the parser. */ +struct def *defs; +int ndefs; + +static struct node *makenode (); +static struct variation *makevar (); +static struct def *makedef (); + +void yyerror (); + +%} + +%union +{ + char *string; + struct def *def; + struct variation *variation; + struct node *node; +} + +%token <string> DEFOP STRING +%type <string> opt_string +%type <def> defs def +%type <variation> variations variation +%type <node> list items item + +%% + +top: + defs + { defs = $1; } + ; + +defs: + def + | defs def + { $2->next = $1; $$ = $2; } + ; + +def: + DEFOP '(' STRING ',' opt_string ',' '(' variations ')' ')' + { $$ = makedef ($3, $5, $8); } + ; + +variations: + variation + | variations ',' variation + { $3->next = $1; $$ = $3; } + ; + +variation: + '(' opt_string ')' + { $$ = makevar ($2, (struct node *) NULL, (struct node *) NULL, (struct node *) NULL); } + | '(' opt_string ',' list ')' + { $$ = makevar ($2, $4, (struct node *) NULL, (struct node *) NULL); } + | '(' opt_string ',' list ',' list ')' + { $$ = makevar ($2, $4, $6, (struct node *) NULL); } + | '(' opt_string ',' list ',' list ',' list ')' + { $$ = makevar ($2, $4, $6, $8); } + ; + +opt_string: + /* empty */ { $$ = ""; } + | STRING { $$ = $1; } + ; + +list: + '(' items ')' + { $$ = $2; } + | /* empty */ + { $$ = NULL; } + ; + +items: + item + /* Note right recursion. */ + | item ',' items + { $1->next = $3; $$ = $1; } + ; + +item: + STRING + { $$ = makenode ($1); } + ; + +%% + +static struct node * +makenode (s) + char *s; +{ + struct node *n; + + n = (struct node *) malloc (sizeof (struct node)); + n->text = s; + n->next = NULL; + return n; +} + +static struct variation * +makevar (name, inputs, outputs, literals) + char *name; + struct node *inputs, *outputs, *literals; +{ + struct variation *v; + + v = (struct variation *) malloc (sizeof (struct variation)); + v->name = name; + v->code = ndefs++; + v->inputs = inputs; + v->outputs = outputs; + v->literals = literals; + v->next = NULL; + return v; +} + +static struct def * +makedef (name, template, vars) + char *name, *template; + struct variation *vars; +{ + struct def *d; + + d = (struct def *) malloc (sizeof (struct def)); + d->basename = name; + d->template = template; + d->variations = vars; + d->next = NULL; + return d; +} + +void +yyerror (s) + char *s; +{ + fprintf (stderr, "syntax error in input\n"); + exit (FATAL_EXIT_CODE); +} |