/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- * * The contents of this file are subject to the Netscape Public * License Version 1.1 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.mozilla.org/NPL/ * * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. * * The Original Code is mozilla.org code. * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are * Copyright (C) 1998 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): */ %{ #include #include "Fundamentals.h" #include "Primitives.h" #include "GraphBuilder.h" #include "Value.h" #include "Vector.h" #include "cstubs.h" #define YYPARSE_PARAM gb #define builder (*(GraphBuilder *)gb) %} %pure_parser %union { char *yyString; Value yyValue; ValueKind yyValueKind; PrimitiveOperation yyPrimitiveOperation; Vector *yyConsumerVector; ConsumerOrConstant *yyConsumer; char *yyProducer; }; %token PRIMITIVE %token LEFT_ASSIGNMENT %token RIGHT_ASSIGNMENT %token STRING %token NUMBER %token KIND %token LABEL %token PHI %type arg %type args %type result %type kind %type phi %% input: /* empty */ | input line ; line: '\n' { } | label '\n' { } | instruction '\n' { } | label instruction '\n' { } | error '\n' { yyerrok; } ; label: LABEL { builder.defineLabel($1); } ; instruction: PRIMITIVE kind args RIGHT_ASSIGNMENT result { builder.buildPrimitive($1, *$3, $5); delete $3; // delete the vector free($5); } | PHI kind args RIGHT_ASSIGNMENT result { char *var = builder.getPhiVariable(*$3); builder.aliasVariable(var, $5); delete $3; // delete the vector free($5); free(var); } | result LEFT_ASSIGNMENT PRIMITIVE kind args { builder.buildPrimitive($3, *$5, $1); delete $5; // delete the vector free($1); } | result LEFT_ASSIGNMENT PHI kind args { char *var = builder.getPhiVariable(*$5); builder.aliasVariable(var, $1); delete $5; // delete the vector free($1); free(var); } | PRIMITIVE kind args { builder.buildPrimitive($1, *$3); delete $3; // delete the vector } ; kind: /* empty */ { $$ = vkInt; } | KIND { $$ = $1 } ; args: { $$ = new Vector(); } | arg { $$ = new Vector(); $$->append($1); } | args ',' arg { $$ = $1; $$->append($3); } ; arg: STRING { $$ = new ConsumerOrConstant($1); free($1); } | NUMBER { $$ = new ConsumerOrConstant($1); } | phi { $$ = new ConsumerOrConstant($1); free($1); } result: STRING { $$ = $1; } phi: PHI '(' args ')' { $$ = builder.getPhiVariable(*$3); } | PHI '(' args ')' '@' STRING { $$ = builder.getPhiVariable(*$3, $6); } %% int yyerror(char *string) { fprintf (stderr, "%s at line %d\n", string, yylineno); exit(EXIT_FAILURE); return 0; }