Google
 

Trailing-Edge - PDP-10 Archives - SRI_NIC_PERM_FS_1_19910112 - kcc-6/kcc/cctoks.h
There are 7 other files named cctoks.h in the archive. Click here to see a list.
/*	CCTOKS.H - Token and Node-Op bindings for KCC
**
**	(c) Copyright Ken Harrenstien 1989
**		All changes after v.75, 17-Apr-1988
**	(c) Copyright Ken Harrenstien, SRI International 1985, 1986
*/

/* This file contains one "tokdef" macro call for every token and node op
 * used by KCC.  The program which #includes this file is responsible for
 * defining "tokdef" in an appropriate way (see CCDATA.C and CCNODE.H).
 * The first entry should NOT correspond to any valid token or node op,
 * so that zero indices and values can be trapped as errors.
 * If no "tokdef" macro is defined, it is assumed that the file is being
 * included merely to get the various symbol definitions.
 */

/* The following naming conventions exist:
 *	T_	Token code.  Used only as a token, never as a node op.
 *	Q_	Token and Node-op.  Used as both.
 *	N_	Node-op code.  Used only as a node op, never as a token.
 */
/*
**	A note on tokens: all tokens returned from the lexer (T_ and Q_ codes)
** are distinct, except for -, &, and *.  Q_MINUS, Q_ANDT, and Q_MPLY are
** returned for these.  The parser must determine whether these are actually
** N_NEG, N_ADDR, or N_PTR.
*/

#undef TOKDEF_DEFINED	/* Assume includer hasn't defined tokdef */
#ifndef tokdef
#define tokdef(name,str,type,prec) name,
#else
#define TOKDEF_DEFINED	/* Ah, user is doing special stuff! */
#endif


#ifndef TOKDEF_DEFINED

/* Define structure of entries in the "tok" table, indexed by token
 * number.  Table is built in CCDATA.
 */
#define TOKEN struct token
TOKEN {			/* Entry indexed by token number (T_,Q_,N_) */
	short tktype;	/*  token type (set to a TKTY_ value) */
        short tkprec;	/*  operator precedence, if meaningful */
};			/*  or various token-specific stuff */

/* Token type codes (TOKEN.tktype)
** There are only two things set with these values:
**	(1) The tok[] array in CCDATA, with one entry for every possible token.
**	(2) The "Skey" component of a SC_RW (reserved word) symbol table entry.
** The TKTY_NULL value is never referenced directly; its exact value
**	doesn't matter as long as it isn't one of the other types.
** The .tkprec value is only used in two places:
**	[1] by binary() in CCSTMT, if the type is one of TKTY_BINOP
**		or TKTY_BOOLOP.  Precedence is a number from 0 (ignored) to
**		16 (highest precedence) as per H&S table 7-1.
**	[2] by initsym() in CCSYM, if the type is a reserved word, i.e. one of
**		TKTY_RWTYPE, TKTY_RWSC, TKTY_RWCOMP.  It contains RWF_ flags.
** .tkprec is ignored for all other token types.
*/

enum toktype {
	TKTY_NULL,	/* None of the following */
	TKTY_PRIMARY,	/* Primary expression */
	TKTY_UNOP,	/* Unary operator */
	TKTY_BOOLUN,	/* Unary boolean operator (only '!') */
	TKTY_BINOP,	/* Binary operator */
	TKTY_BOOLOP,	/* Binary boolean operator */
	TKTY_ASOP,	/* Binary assignment operator */
	TKTY_TERNARY,	/* Ternary (conditional) operator (only '?') */
	TKTY_SEQ,	/* Sequential evaluation operator (only ',') */
	TKTY_RWTYPE,	/* Reserved-Word: Type-specifier */
	TKTY_RWSC,	/* Reserved-Word: Storage Class */
	TKTY_RWCOMP,	/* Reserved-Word: Compound statement */
	TKTY_RWOP	/* Reserved-Word: Built-in operator (e.g. "calls") */
};

/* Reserved-word token flags */
#define RWF_PREC	077	/* Operator precedence, if applicable */
#define RWF_ANSI	0100	/* Keyword is ANSI addition */
#define RWF_KCC		0200	/* Keyword is KCC extension */

enum tokcodes {
#endif

/* Simple tokens.  Most correspond to single characters. */
tokdef(T_NULL,	0,	TKTY_NULL, 0)	/* 0 is an invalid token/node-op */
tokdef(T_EOF,	0,	TKTY_NULL, 0)	/* EOF reached */
tokdef(T_WSP,	" ",	TKTY_NULL, 0)	/* Whitespace */
tokdef(T_EOL,	"\n",	TKTY_NULL, 0)	/* EOL */
tokdef(T_IDENT,	0,	TKTY_NULL, 0)	/* Non-macro identifier */
tokdef(T_MACRO,	0,	TKTY_NULL, 0)	/* Macro identifier */
tokdef(T_MACARG,0,	TKTY_NULL, 0)	/* Expand arg (in macro body) */
tokdef(T_MACSTR,0,	TKTY_NULL, 0)	/* Stringize arg (in macro body) */
tokdef(T_MACINS,0,	TKTY_NULL, 0)	/* Insert arg (in macro body) */
tokdef(T_MACCAT,0,	TKTY_NULL, 0)	/* Concatenate op (in macro body) */
tokdef(T_MACEOF,0,	TKTY_NULL, 0)	/* Macro EOF reached */
tokdef(T_ICONST,0,	TKTY_NULL, 0)	/* PP-number integer const */
tokdef(T_FCONST,0,	TKTY_NULL, 0)	/* PP-number floating const */
tokdef(T_CCONST,0,	TKTY_NULL, 0)	/* Character constant */
tokdef(T_SCONST,0,	TKTY_NULL, 0)	/* String literal constant */
tokdef(T_UNKNWN,0,	TKTY_NULL, 0)	/* Unknown token string */
tokdef(T_ELPSIS,"...",	TKTY_NULL, 0)	/* "..." */
tokdef(T_SHARP,	"#",	TKTY_NULL, 0)	/* #  Stringize op */
tokdef(T_SHARP2,"##",	TKTY_NULL, 0)	/* ## Concatenate op */

tokdef(T_LPAREN,"(",	TKTY_NULL, 0)	/* ( */
tokdef(T_RPAREN,")",	TKTY_NULL, 0)	/* ) */
tokdef(T_SCOLON,";",	TKTY_NULL, 0)	/* ; */
tokdef(T_LBRACK,"[",	TKTY_NULL, 0)	/* [ */
tokdef(T_RBRACK,"]",	TKTY_NULL, 0)	/* ] */
tokdef(T_LBRACE,"{",	TKTY_NULL, 0)	/* { */
tokdef(T_RBRACE,"}",	TKTY_NULL, 0)	/* } */
tokdef(T_COLON,	":",	TKTY_NULL, 0)	/* : */
tokdef(T_COMMA,	",",	TKTY_NULL, 0)	/* , */
tokdef(T_LCONST,0,	TKTY_NULL, 0)	/* Literal constant (any) */
tokdef(T_INC,	"++",	TKTY_NULL, 0)	/* ++ */
tokdef(T_DEC,	"--",	TKTY_NULL, 0)	/* -- */

/* Tokens/Node-Ops organized by operator type
** 	This listing follows [H&S table 7-1, sec 7.2.2]
*/
/* Primary expressions */
tokdef(Q_IDENT,	0,TKTY_PRIMARY,	16)	/* identifier */
tokdef(N_UNDEF,	0,TKTY_PRIMARY,	16)	/* Undef ident (error placeholder) */
tokdef(N_ICONST,0,TKTY_PRIMARY,	16)	/* Integral type constant */
tokdef(N_FCONST,0,TKTY_PRIMARY,	16)	/* Floating-point type constant */
tokdef(N_SCONST,0,TKTY_PRIMARY,	16)	/* String literal constant */
tokdef(N_PCONST,0,TKTY_PRIMARY,	16)	/* Pointer-type constant */
tokdef(N_VCONST,0,TKTY_PRIMARY,	16)	/* Void-type "constant" expr */
tokdef(N_ECONST,0,TKTY_PRIMARY,	16)	/* Enum-type constant */
tokdef(N_ACONST,0,TKTY_PRIMARY,	16)	/* Special - address constant??? */
/* no special op for subscript */	/* [k]	subscripting */
tokdef(N_FNCALL,0,TKTY_PRIMARY,	16)	/* f()	function call */
tokdef(Q_DOT,	".",	TKTY_PRIMARY,	16)	/* .	direct selection */
tokdef(Q_MEMBER,"->",	TKTY_PRIMARY,	16)	/* ->	indirect selection */

/* Unary operators */
tokdef(N_POSTINC, 0,	TKTY_UNOP,	15)	/* ()++	Postfix increment */
tokdef(N_POSTDEC, 0,	TKTY_UNOP,	15)	/* ()--	Postfix decrement */
tokdef(N_PREINC, 0,	TKTY_UNOP,	14)	/* ++()	Prefix increment */
tokdef(N_PREDEC, 0,	TKTY_UNOP,	14)	/* --()	Prefix decrement */
tokdef(T_SIZEOF,"sizeof",TKTY_RWOP,	14)	/* sizeof	Size */
tokdef(N_CAST,	0,	TKTY_UNOP,	14)	/* (type)	Cast */
tokdef(Q_COMPL,	"~",	TKTY_UNOP,	14)	/* ~	Bitwise not */
tokdef(Q_NOT,	"!",	TKTY_BOOLUN,	14)	/* !	Logical not */
tokdef(N_NEG,	0,	TKTY_UNOP,	14)	/* -()	Arithmetic negation */
tokdef(N_ADDR,	0,	TKTY_UNOP,	14)	/* &()	Address of */
tokdef(N_PTR,	0,	TKTY_UNOP,	14)	/* *()	Indirection */

/* Binary operators (and one ternary) */
tokdef(Q_MPLY,	"*",	TKTY_BINOP,	13)	/* *	(L) Multiply */
tokdef(Q_DIV,	"/",	TKTY_BINOP,	13)	/* /	(L) Divide */
tokdef(Q_MOD,	"%",	TKTY_BINOP,	13)	/* %	(L) Remainder */
tokdef(Q_PLUS,	"+",	TKTY_BINOP,	12)	/* +	(L) Add */
tokdef(Q_MINUS,	"-",	TKTY_BINOP,	12)	/* -	(L) Subtract */
tokdef(Q_LSHFT,	"<<",	TKTY_BINOP,	11)	/* <<	(L) Left shift */
tokdef(Q_RSHFT,	">>",	TKTY_BINOP,	11)	/* >>	(L) Right shift */
tokdef(Q_LESS,	"<",	TKTY_BOOLOP,	10)	/* <	(L) Less than */
tokdef(Q_GREAT,	">",	TKTY_BOOLOP,	10)	/* >	(L) Greater than */
tokdef(Q_LEQ,	"<=",	TKTY_BOOLOP,	10)	/* <=	(L) Less or equal */
tokdef(Q_GEQ,	">=",	TKTY_BOOLOP,	10)	/* >=	(L) Greater or equal */
tokdef(Q_EQUAL,	"==",	TKTY_BOOLOP,	9)	/* ==	(L) Equal */
tokdef(Q_NEQ,	"!=",	TKTY_BOOLOP,	9)	/* !=	(L) Unequal */
tokdef(Q_ANDT,	"&",	TKTY_BINOP,	8)	/* &	(L) Bitwise AND */
tokdef(Q_XORT,	"^",	TKTY_BINOP,	7)	/* ^	(L) Bitwise XOR */
tokdef(Q_OR,	"|",	TKTY_BINOP,	6)	/* |	(L) Bitwise OR */
tokdef(Q_LAND,	"&&",	TKTY_BOOLOP,	5)	/* &&	(L) Logical AND */
tokdef(Q_LOR,	"||",	TKTY_BOOLOP,	4)	/* ||	(L) Logical OR */
tokdef(Q_QUERY,	"?",	TKTY_TERNARY,	3)	/* ?	(R) Conditional */
tokdef(Q_ASGN,	"=",	TKTY_ASOP,	2)	/* =	(R) Assignment */
tokdef(Q_ASPLUS,"+=",	TKTY_ASOP,	2)	/* +=	(R)	*/
tokdef(Q_ASMINUS,"-=",	TKTY_ASOP,	2)	/* -=	(R)	*/
tokdef(Q_ASMPLY,"*=",	TKTY_ASOP,	2)	/* *=	(R)	*/
tokdef(Q_ASDIV,	"/=",	TKTY_ASOP,	2)	/* /=	(R)	*/
tokdef(Q_ASMOD,	"%=",	TKTY_ASOP,	2)	/* %=	(R)	*/
tokdef(Q_ASRSH,	">>=",	TKTY_ASOP,	2)	/* >>=	(R)	*/
tokdef(Q_ASLSH,	"<<=",	TKTY_ASOP,	2)	/* <<=	(R)	*/
tokdef(Q_ASAND,	"&=",	TKTY_ASOP,	2)	/* &=	(R)	*/
tokdef(Q_ASXOR,	"^=",	TKTY_ASOP,	2)	/* ^=	(R)	*/
tokdef(Q_ASOR,	"|=",	TKTY_ASOP,	2)	/* |=	(R)	*/
tokdef(N_EXPRLIST,0,	TKTY_SEQ,	1)	/* ,	(L) sequential eval */

/* Reserved-Word: Type-specifier */
/* See the tnames table in CCDATA for other type-spec reserved words */
tokdef(T_VOID,	"void",		TKTY_RWTYPE, 0)
tokdef(T_STRUCT,"struct",	TKTY_RWTYPE, 0)
tokdef(T_UNION,	"union",	TKTY_RWTYPE, 0)
tokdef(T_ENUM,	"enum",		TKTY_RWTYPE, 0)
tokdef(T_FLOAT,	"float",	TKTY_RWTYPE, 0)
tokdef(T_DOUBLE,"double",	TKTY_RWTYPE, 0)
tokdef(T_CHAR,	"char",		TKTY_RWTYPE, 0)
tokdef(T_SHORT,	"short",	TKTY_RWTYPE, 0)
tokdef(T_INT,	"int",		TKTY_RWTYPE, 0)
tokdef(T_LONG,	"long",		TKTY_RWTYPE, 0)
tokdef(T_UNSIGNED,"unsigned",	TKTY_RWTYPE, 0)
tokdef(T_SIGNED,"signed",	TKTY_RWTYPE, RWF_ANSI)	/* (ANSI addition) */
tokdef(T_CONST,	"const",	TKTY_RWTYPE, RWF_ANSI)	/* (ANSI addition) */
tokdef(T_VOLATILE,"volatile",	TKTY_RWTYPE, RWF_ANSI)	/* (ANSI addition) */
tokdef(T_CHAR6,	"_KCCtype_char6",TKTY_RWTYPE, RWF_KCC)	/* (KCC extension) */
tokdef(T_CHAR7,	"_KCCtype_char7",TKTY_RWTYPE, RWF_KCC)	/* (KCC extension) */
tokdef(T_CHAR8,	"_KCCtype_char8",TKTY_RWTYPE, RWF_KCC)	/* (KCC extension) */
tokdef(T_CHAR9,	"_KCCtype_char9",TKTY_RWTYPE, RWF_KCC)	/* (KCC extension) */
tokdef(T_CHAR18,"_KCCtype_char18",TKTY_RWTYPE, RWF_KCC)	/* (KCC extension) */
#if SYS_CSI
tokdef(T_FORTRAN, "fortran",   	TKTY_RWTYPE, RWF_KCC)   /* (KCC extension) */
tokdef(T_BLISS,   "bliss",	TKTY_RWTYPE, RWF_KCC)   /* (KCC extension) */
#endif

/* Reserved-Word: Storage Class */
tokdef(T_AUTO,	"auto",		TKTY_RWSC, 0)
tokdef(T_EXTERN,"extern",	TKTY_RWSC, 0)
tokdef(T_REGISTER,"register",	TKTY_RWSC, 0)
tokdef(T_TYPEDEF,"typedef",	TKTY_RWSC, 0)
tokdef(T_STATIC,"static",	TKTY_RWSC, 0)

/* Reserved-Word: Compound statement */
tokdef(Q_GOTO,	"goto",		TKTY_RWCOMP, 0)
tokdef(Q_RETURN,"return",	TKTY_RWCOMP, 0)
tokdef(Q_BREAK,	"break",	TKTY_RWCOMP, 0)
tokdef(Q_CONTINUE,"continue",	TKTY_RWCOMP, 0)
tokdef(Q_IF,	"if",		TKTY_RWCOMP, 0)
tokdef(T_ELSE,	"else",		TKTY_RWCOMP, 0)
tokdef(Q_FOR,	"for",		TKTY_RWCOMP, 0)
tokdef(Q_DO,	"do",		TKTY_RWCOMP, 0)
tokdef(Q_WHILE,	"while",	TKTY_RWCOMP, 0)
tokdef(Q_SWITCH,"switch",	TKTY_RWCOMP, 0)
tokdef(Q_CASE,	"case",		TKTY_RWCOMP, 0)
tokdef(Q_DEFAULT,"default",	TKTY_RWCOMP, 0)

/* Reserved-Word: Built-in operators */
tokdef(Q_ASM,	"asm",		TKTY_RWOP, RWF_KCC+16)	/* asm() */
tokdef(T_OFFSET,"_KCC_offsetof",TKTY_RWOP,RWF_ANSI+RWF_KCC+16) /* offsetof() */
tokdef(T_SYMVAL,"_KCCx",	TKTY_RWOP, RWF_KCC+16)	/* Placeholder */
tokdef(T_SYMFND,"_KCCy",	TKTY_RWOP, RWF_KCC+16)	/* Placeholder */


/* Miscellaneous node ops */
tokdef(N_FUNCTION,0,	TKTY_NULL, 0)	/* Function definition */
tokdef(N_STATEMENT,0,	TKTY_NULL, 0)	/* Statement list */
tokdef(N_LABEL,	0,	TKTY_NULL, 0)	/* Labelled statement */
tokdef(N_DATA,	0,	TKTY_NULL, 0)	/* Data decl list, contains N_IZs */
tokdef(N_IZ,	0,	TKTY_NULL, 0)	/* Identifier decl (w/optional init) */
tokdef(N_IZLIST,0,	TKTY_NULL, 0)	/* Initializer list (under N_IZ) */
tokdef(N_LITIZ,0,	TKTY_NULL, 0)	/* Literal izer list */
tokdef(N_NODE,	0,	TKTY_NULL, 0)	/* Random substructure node op */
tokdef(N_ERROR,	0,	TKTY_NULL, 0)	/* Error placeholder (stmt or expr) */

#ifndef TOKDEF_DEFINED		/* If doing enum defs, wrap up. */
	NTOKDEFS		/* # of tokens defined */
};
#undef tokdef
#endif