dextern revision 7c478bd95313f5f23a4c958a745db2134aa03244
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 1993 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/* Copyright (c) 1988 AT&T */
/* All Rights Reserved */
#pragma ident "%Z%%M% %I% %E% SMI"
#include <stdio.h>
#include <ctype.h>
#include <memory.h>
#include <string.h>
#include <malloc.h>
#include <values.h>
#ifdef __STDC__
#include <stdlib.h>
#else
extern char *malloc();
extern char *calloc();
extern char *realloc();
extern void exit();
#include <sys/types.h> /* for size_t */
#ifndef _SIZE_T
#define _SIZE_T
#if defined(_LP64) || defined(_I32LPx)
typedef unsigned long size_t; /* size of something in bytes */
#else
typedef unsigned int size_t; /* (historical version) */
#endif
#endif
#endif
#ifdef NOLIBW
/*
* no wide char classification macro or I/O.
* mimic these with whatever we have.
* "%ws", L'c' and L"ssss" in the source files are
* replaced by sed in makefile.
*/
#define iswascii(c) isascii((char)(c))
#define iswspace(c) isspace((char)(c))
#define iswalpha(c) isalpha((char)(c))
#define iswdigit(c) isdigit((char)(c))
#define iswxdigit(c) isxdigit((char)(c))
#define iswupper(c) isupper((char)(c))
#define iswlower(c) islower((char)(c))
#define towlower(c) ((wchar_t) tolower((char)(c)))
#define getwc(f) getc(f)
#define ungetwc(c, f) ungetc((char)(c), f)
#define putwc(c, f) putc((char)(c), (f))
#else /* !NOLIBW */ /* This is probably a SysV with MNLS extension. */
#include <wctype.h>
#endif /* !NOLIBW */
/* MANIFEST CONSTANT DEFINITIONS */
#if u3b || u3b15 || u3b2 || vax || uts || sparc
#define WORD32
#endif
#include <libintl.h>
/* base of nonterminal internal numbers */
#define NTBASE (10000000)
/* internal codes for error and accept actions */
#define ERRCODE 8190
#define ACCEPTCODE 8191
/* sizes and limits */
#define ACTSIZE 4000
#define MEMSIZE 2000
#define PSTSIZE 1024
#define NSTATES 1000
#define NTERMS 127
#define NPROD 300
#define NNONTERM 600
#define TEMPSIZE 800
#define CNAMSZ 1000
#define LSETSIZE 950
#define WSETSIZE 850
#define NAMESIZE 50
#define NTYPES 1000
#define NMBCHARSZ 100
#define LKFACTOR 5
#ifdef WORD32
/* bit packing macros (may be machine dependent) */
#define BIT(a, i) ((a)[(i)>>5] & (1<<((i)&037)))
#define SETBIT(a, i) ((a)[(i)>>5] |= (1<<((i)&037)))
/* number of words needed to hold n+1 bits */
#define NWORDS(n) (((n)+32)/32)
#else
/* bit packing macros (may be machine dependent) */
#define BIT(a, i) ((a)[(i)>>4] & (1<<((i)&017)))
#define SETBIT(a, i) ((a)[(i)>>4] |= (1<<((i)&017)))
/* number of words needed to hold n+1 bits */
#define NWORDS(n) (((n)+16)/16)
#endif
/*
* relationships which must hold:
* TBITSET ints must hold NTERMS+1 bits...
* WSETSIZE >= NNONTERM
* LSETSIZE >= NNONTERM
* TEMPSIZE >= NTERMS + NNONTERMs + 1
* TEMPSIZE >= NSTATES
*/
/* associativities */
#define NOASC 0 /* no assoc. */
#define LASC 1 /* left assoc. */
#define RASC 2 /* right assoc. */
#define BASC 3 /* binary assoc. */
/* flags for state generation */
#define DONE 0
#define MUSTDO 1
#define MUSTLOOKAHEAD 2
/* flags for a rule having an action, and being reduced */
#define ACTFLAG 04
#define REDFLAG 010
/* output parser flags */
#define YYFLAG1 (-10000000)
/* macros for getting associativity and precedence levels */
#define ASSOC(i) ((i)&07)
#define PLEVEL(i) (((i)>>4)&077)
#define TYPE(i) ((i>>10)&077)
/* macros for setting associativity and precedence levels */
#define SETASC(i, j) i |= j
#define SETPLEV(i, j) i |= (j<<4)
#define SETTYPE(i, j) i |= (j<<10)
/* looping macros */
#define TLOOP(i) for (i = 1; i <= ntokens; ++i)
#define NTLOOP(i) for (i = 0; i <= nnonter; ++i)
#define PLOOP(s, i) for (i = s; i < nprod; ++i)
#define SLOOP(i) for (i = 0; i < nstate; ++i)
#define WSBUMP(x) ++x
#define WSLOOP(s, j) for (j = s; j < &wsets[cwp]; ++j)
#define ITMLOOP(i, p, q) q = pstate[i+1]; for (p = pstate[i]; p < q; ++p)
#define SETLOOP(i) for (i = 0; i < tbitset; ++i)
/* I/O descriptors */
extern FILE * finput; /* input file */
extern FILE * faction; /* file for saving actions */
extern FILE * fdefine; /* file for #defines */
extern FILE * ftable; /* y.tab.c file */
extern FILE * ftemp; /* tempfile to pass 2 */
extern FILE * fdebug; /* tempfile for two debugging info arrays */
extern FILE * foutput; /* y.output file */
/* structure declarations */
typedef struct looksets {
int *lset;
} LOOKSETS;
typedef struct item {
int *pitem;
LOOKSETS *look;
} ITEM;
typedef struct toksymb {
wchar_t *name;
int value;
} TOKSYMB;
typedef struct mbclit {
wchar_t character;
int tvalue; /* token issued for the character */
} MBCLIT;
typedef struct ntsymb {
wchar_t *name;
int tvalue;
} NTSYMB;
typedef struct wset {
int *pitem;
int flag;
LOOKSETS ws;
} WSET;
/* token information */
extern int ntokens; /* number of tokens */
extern TOKSYMB *tokset;
extern int ntoksz;
/*
* multibyte (c > 255) character literals are
* handled as though they were tokens except
* that it generates a separate mapping table.
*/
extern int nmbchars; /* number of mb literals */
extern MBCLIT *mbchars;
extern int nmbcharsz;
/* nonterminal information */
extern int nnonter; /* the number of nonterminals */
extern NTSYMB *nontrst;
extern int nnontersz;
/* grammar rule information */
extern int nprod; /* number of productions */
extern int **prdptr; /* pointers to descriptions of productions */
extern int *levprd; /* contains production levels to break conflicts */
extern wchar_t *had_act; /* set if reduction has associated action code */
/* state information */
extern int nstate; /* number of states */
extern ITEM **pstate; /* pointers to the descriptions of the states */
extern int *tystate; /* contains type information about the states */
extern int *defact; /* the default action of the state */
extern int size;
/* lookahead set information */
extern int TBITSET;
extern LOOKSETS *lkst;
extern int nolook; /* flag to turn off lookahead computations */
/* working set information */
extern WSET *wsets;
/* storage for productions */
extern int *mem0;
extern int *mem;
extern int *tracemem;
extern int new_memsize;
/* storage for action table */
extern int *amem;
extern int *memp; /* next free action table position */
extern int *indgo; /* index to the stored goto table */
extern int new_actsize;
/* temporary vector, indexable by states, terms, or ntokens */
extern int *temp1;
extern int lineno; /* current line number */
/* statistics collection variables */
extern int zzgoent;
extern int zzgobest;
extern int zzacent;
extern int zzexcp;
extern int zzrrconf;
extern int zzsrconf;
/* define external functions */
extern void setup(int, char * []);
extern void closure(int);
extern void output(void);
extern void aryfil(int *, int, int);
extern void error(char *, ...);
extern void warning(int, char *, ...);
extern void putitem(int *, LOOKSETS *);
extern void go2out(void);
extern void hideprod(void);
extern void callopt(void);
extern void warray(wchar_t *, int *, int);
extern wchar_t *symnam(int);
extern wchar_t *writem(int *);
extern void exp_mem(int);
extern void exp_act(int **);
extern apack(int *, int);
extern int state(int);
extern void fprintf3(FILE *, const char *, const wchar_t *, const char *, ...);
extern void error3(const char *, const wchar_t *, const char *, ...);
extern wchar_t *wscpy(wchar_t *, const wchar_t *);
extern size_t wslen(const wchar_t *);
extern int wscmp(const wchar_t *, const wchar_t *);
/* yaccpar location */
extern char *parser;
/* default settings for a number of macros */
/* name of yacc tempfiles */
#ifndef TEMPNAME
#define TEMPNAME "yacc.tmp"
#endif
#ifndef ACTNAME
#define ACTNAME "yacc.acts"
#endif
#ifndef DEBUGNAME
#define DEBUGNAME "yacc.debug"
#endif
/* command to clobber tempfiles after use */
#ifndef ZAPFILE
#define ZAPFILE(x) (void)unlink(x)
#endif
#ifndef PARSER
#define PARSER "/usr/ccs/lib/yaccpar"
#endif