diff options
author | bson <bson@138bc75d-0d04-0410-961f-82ee72b054a4> | 1993-09-21 21:25:11 +0000 |
---|---|---|
committer | bson <bson@138bc75d-0d04-0410-961f-82ee72b054a4> | 1993-09-21 21:25:11 +0000 |
commit | 9175412d6ac92ee9a762d3033177fcbf9359a75e (patch) | |
tree | 7eef27115be0e72f2683c69931b5dbb0eed65696 /gcc/bi-parser.y | |
parent | 7f4acb6dd6a0bb6a524d51cdd3fb61b84b92ab03 (diff) | |
download | gcc-9175412d6ac92ee9a762d3033177fcbf9359a75e.tar.gz |
Initial revision
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@5378 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/bi-parser.y')
-rw-r--r-- | gcc/bi-parser.y | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/gcc/bi-parser.y b/gcc/bi-parser.y new file mode 100644 index 00000000000..07d1319cb95 --- /dev/null +++ b/gcc/bi-parser.y @@ -0,0 +1,168 @@ +/* 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, 675 Mass Ave, Cambridge, MA 02139, USA. */ + + +%{ + +#include <stdio.h> +#include "bi-defs.h" + +extern char yytext[]; +extern int yyleng; + +extern char *malloc(); + + +/* 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(); + +%} + +%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; +{ + extern int yylineno; + + fprintf(stderr, "syntax error in line %d\n", yylineno); + exit(1); +} |