/*
* pswparser.y
*
* (c) Copyright 1988-1994 Adobe Systems Incorporated.
* All rights reserved.
*
* Permission to use, copy, modify, distribute, and sublicense this software
* and its documentation for any purpose and without fee is hereby granted,
* provided that the above copyright notices appear in all copies and that
* both those copyright notices and this permission notice appear in
* supporting documentation and that the name of Adobe Systems Incorporated
* not be used in advertising or publicity pertaining to distribution of the
* software without specific, written prior permission. No trademark license
* to use the Adobe trademarks is hereby granted. If the Adobe trademark
* "Display PostScript"(tm) is used to describe this software, its
* functionality or for any other purpose, such use shall be limited to a
* statement that this software works in conjunction with the Display
* PostScript system. Proper trademark attribution to reflect Adobe's
* ownership of the trademark shall be given whenever any such reference to
* the Display PostScript system is made.
*
* ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
* ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
* ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
* IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
* TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
* NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
* PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
*
* Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
* Incorporated which may be registered in certain jurisdictions
*
* Author: Adobe Systems Incorporated
*/
/* $XFree86: xc/config/pswrap/pswparser.y,v 1.4 2000/05/18 23:46:08 dawes Exp $ */
/*
* Not all yaccs understand this.
*
%expect 1
*/
%{
#include "pswpriv.h"
#include "pswsemantics.h"
%}
/* yylval type (from lexer and on stack) */
%union {
char *object;
long intobj;
Token token;
Item item;
Header header;
int flag;
Arg arg;
Subscript subscript;
}
%token <object> DEFINEPS ENDPS STATIC
%token <object> PSCONTEXT
%token <object> BOOLEAN FLOAT DOUBLE UNSIGNED SHORT LONG INT CHAR USEROBJECT
%token <object> NUMSTRING
%token <object> CNAME
%token <intobj> CINTEGER
%token <object> PSNAME PSLITNAME PSREAL PSBOOLEAN PSSTRING PSHEXSTRING
%token <intobj> PSINTEGER
%token <object> PSSUBNAME PSINDEX
%token <object> '(' ')' '|' ';' ',' '*' '[' ']' '{' '}' ':'
%type <token> Token Tokens Body
%type <item> Items Item
%type <header> Header
%type <flag> Def Type
%type <arg> InArgs Args ContextArg SubArgs Arg
%type <subscript> Subscript
%start Module
%%
Module:
/* empty */
| Module Definition
;
Definition:
Header Body ENDPS
{ FinalizePSWrapDef($1, $2); yyerrok; }
| error ENDPS
{ yyerrok; }
;
Body:
/* nothing */
{ $$ = 0; }
| Tokens
/* { $$ = $1; }*/
;
Tokens:
Token
{ $$ = AppendPSWToken($1, 0L); }
| Tokens Token
{ $$ = AppendPSWToken($2, $1); yyerrok; }
/* | error
{ $$ = 0; } */
;
Header:
Def ')'
{ $$ = PSWHeader($1, 0, 0); yyerrok; }
| Def InArgs ')'
{ $$ = PSWHeader($1, $2, 0); yyerrok; }
| Def InArgs '|' Args ')'
{ $$ = PSWHeader($1, $2, $4); yyerrok; }
| Def '|' Args ')'
{ $$ = PSWHeader($1, 0, $3); yyerrok; }
;
Def:
DEFINEPS CNAME '('
{ PSWName($2); $$ = 0; yyerrok; }
| DEFINEPS STATIC CNAME '('
{ PSWName($3); $$ = 1; yyerrok; }
| DEFINEPS error '('
{ PSWName("error"); $$ = 0; yyerrok; }
;
Semi:
/* nothing */
| ';' { yyerrok; }
;
InArgs:
ContextArg Semi
/* { $$ = $1; } */
| Args
/* { $$ = $1; } */
| ContextArg ';' Args
{ $$ = ConsPSWArgs($1, $3); }
;
ContextArg:
PSCONTEXT CNAME
{ $$ = PSWArg(T_CONTEXT, PSWItem($2)); }
;
Args:
SubArgs Semi
/* { $$ = $1; }*/
;
SubArgs:
Arg
/* { $$ = $1; }*/
| SubArgs ';' Arg
{ yyerrok; $$ = AppendPSWArgs($3, $1); }
| SubArgs error
| SubArgs error Arg
{ yyerrok; $$ = AppendPSWArgs($3, $1); }
| SubArgs ';' error
;
Arg: Type Items
{ $$ = PSWArg($1, $2); yyerrok; }
;
Items:
Item
/* { $$ = $1; } */
| Items ',' Item
{ yyerrok; $$ = AppendPSWItems($3, $1); }
| error { $$ = 0; }
| Items error
| Items error Item
{ yyerrok; $$ = AppendPSWItems($3, $1); }
| Items ',' error
;
Item:
'*' CNAME
{ $$ = PSWStarItem($2); }
| CNAME '[' Subscript ']'
{ $$ = PSWSubscriptItem($1, $3); }
| CNAME '[' Subscript ']' ':' CNAME
{ $$ = PSWScaleItem($1, $3, $6, 0); }
| CNAME '[' Subscript ']' ':' CINTEGER
{ $$ = PSWScaleItem($1, $3, NULL, $6); }
| CNAME
{ $$ = PSWItem($1); }
;
Subscript:
CNAME
{ $$ = PSWNameSubscript($1); }
| CINTEGER
{ $$ = PSWIntegerSubscript($1); }
;
Type:
BOOLEAN
{ $$ = T_BOOLEAN; }
| FLOAT
{ $$ = T_FLOAT; }
| DOUBLE
{ $$ = T_DOUBLE; }
| CHAR
{ $$ = T_CHAR; }
| UNSIGNED CHAR
{ $$ = T_UCHAR; }
| INT
{ $$ = T_INT; }
| LONG INT
{ $$ = T_LONGINT; }
| LONG
{ $$ = T_LONGINT; }
| SHORT INT
{ $$ = T_SHORTINT; }
| SHORT
{ $$ = T_SHORTINT; }
| UNSIGNED
{ $$ = T_UINT; }
| UNSIGNED LONG
{ $$ = T_ULONGINT; }
| UNSIGNED INT
{ $$ = T_UINT; }
| UNSIGNED LONG INT
{ $$ = T_ULONGINT; }
| UNSIGNED SHORT
{ $$ = T_USHORTINT; }
| UNSIGNED SHORT INT
{ $$ = T_USHORTINT; }
| USEROBJECT
{ $$ = T_USEROBJECT; }
| NUMSTRING
{ $$ = T_NUMSTR; }
| INT NUMSTRING
{ $$ = T_NUMSTR; }
| FLOAT NUMSTRING
{ $$ = T_FLOATNUMSTR; }
| LONG NUMSTRING
{ $$ = T_LONGNUMSTR; }
| SHORT NUMSTRING
{ $$ = T_SHORTNUMSTR; }
;
Token:
PSINTEGER
{ $$ = PSWToken(T_INT, (char *)$1); }
| PSREAL
{ $$ = PSWToken(T_FLOAT, $1); }
| PSBOOLEAN
{ $$ = PSWToken(T_BOOLEAN, $1); }
| PSSTRING
{ $$ = PSWToken(T_STRING, $1); }
| PSHEXSTRING
{ $$ = PSWToken(T_HEXSTRING, $1); }
| PSNAME
{ $$ = PSWToken(T_NAME, $1); }
| PSLITNAME
{ $$ = PSWToken(T_LITNAME, $1); }
| PSSUBNAME PSINDEX
{ $$ = PSWToken2(T_SUBSCRIPTED, $1, $2); }
| '[' Body ']'
{ $$ = PSWToken(T_ARRAY, (char *)$2); }
| '{' Body '}'
{ $$ = PSWToken(T_PROC, (char *)$2); }
;