static char tab_c_Sccsid[] = "tab.c @(#)tab.c	1.3	10/5/82 Berkeley ";

/*
 * This table defines the operators in APL\11.
 * The first entry is the character representing
 * the operator, the second is the unique operator
 * identifier (which should give you a hint as
 * to what the operator is), and the third is
 * the operator type, of interest only to the
 * interpreter.
 * Those characters represented by octal numbers are actually
 * two-character overstrikes.  Ignore the leading "2", and
 * the rest of the number is an index into "chartab", below,
 * which lists the two-character overstrikes.  Overstrikes
 * may be in either order.
 *
 * Note: What isn't shown here is that unary minus
 * is ` (backwards apostrophe).  This is handled in lex.c, a0.c
 * and a2.c (both input and output).
 */
struct tab
{
	int	input;
	int	lexval;
	int	retval;
} tab[] = {

/*
 * one of a kind
 */

	'(',	unk,lpar,
	')',	unk,rpar,
	'[',	unk,lbkt,
	']',	unk,rbkt,
	'/',	COM,com,
	0200  , COM0,com0,
	'\\',	EXD,com,
	0201  , EXD0,com0,
	'\'',	unk,strng,
	'J',	unk,null,
	'.',	IPROD,dot,
	'L',	QUAD,Quad,
	0202  , QQUAD,Quad,
	0203  , CQUAD,Quad,
	';',	unk,semi,
	':',	unk,cln,
	0204  , COMNT,comnt,
	'C',	COMNT,comnt,
	'}',	BRAN0,tran,

/*
 * dyadic scalars
 *	op2 op1 v (dyadic op)
 */

	'<',	LT,dscal,
	'>',	GT,dscal,
	'$',	LE,dscal,
	0220,	LE,dscal,
	'&',	GE,dscal,
	0221,	GE,dscal,
	'=',	EQ,dscal,
	'#',	NE,dscal,
	0222,	NE,dscal,
	'^',	AND,dscal,
	'A',	AND,dscal,
	'Q',	OR,dscal,
	'V',	OR,dscal,
	0205  , NAND,dscal,
	0231,	NAND,dscal,
	0206  , NOR,dscal,
	0223,	NAND,dscal,
	0224,	NOR,dscal,

/*
 * monadic or dyadic scalars
 *	op2 op1 v (dyadic op)
 *	op1 v+1 (monadic op)
 */

	'+',	ADD,mdscal,
	'-',	SUB,mdscal,
	'M',	MUL,mdscal,
	'X',	MUL,mdscal,
	0225,	MUL,mdscal,
	'P',	DIV,mdscal,
	0240,	DIV,mdscal,
	'%',	DIV,mdscal,
	0226,	DIV,mdscal,
	'|',	MOD,mdscal,
	'D',	MIN,mdscal,
	'S',	MAX,mdscal,
	'*',	PWR,mdscal,
	0207  , LOG,mdscal,
	'O',	CIR,mdscal,
	0210  , COMB,mdscal,
	'!',	COMB,mdscal,

/*
 * monadic
 *	op1 v (monadic op)
 */

	'~',	NOT,m,
	0241,	EPS+1,m,
/*
 * dyadic
 *	op2 op1 v (dyadic op)
 */

	'N',	REP,d,
	'Y',	TAKE,d,
	'U',	DROP,d,
	'_',	ASGN,asg,
	'{',	ASGN,asg,

/*
 * monadic or dyadic
 *	op2 op1 v (dyadic op)
 *	op1 v+1 (monadic op)
 */

	'E',    EPS,md,
	'B',    BASE,md,
	'?',	DEAL,md,
	'R',	DRHO,md,
	'I',	DIOT,md,
	0211  , ROT0,md,
	0212  , DTRN,md,
	0213  , DIBM,md,
	0214  , DDOM,md,
	0242,	DFMT,md,



/*
 * monadic with optional subscript
 *	op1 v (monadic op)
 *	op1 sub v+1 (subscripted monadic op)
 */

	0215  , GDU,msub,
	0216  , GDD,msub,
	0227,	GDU,msub,
	0230,	GDD,msub,

/*
 * dyadic with optional subscript
 *	op2 op1 v (dyadic op)
 *	op2 op1 sub v+1 (subscripted dyadic op)
 */


/*
 * monadic or dyadic with optional subscript
 *	op2 op1 v (dyadic op)
 *	op1 v+1 (monadic op)
 *	op2 op1 sub v+2 (subscripted dyadic op)
 *	op1 sub v+3 (subscripted monadic op)
 */

	0217  , ROT,mdsub,
	',',	CAT,mdsub,

/*
 *	ISP and PSI
 */
	0232,	PSI,d,
	0233,	ISP,d,

/*
 *	other, non-function
 */
	0234,	unk,null,
	0235,	unk,null,
	0236,	unk,null,
	0237,	unk,null,
	'@',	unk,null,

/*
 * end of list
 */

	0
};

struct {
	char	*ct_name;		/* command name string */
	int	ct_ytype;		/* command type */
	int	ct_ylval;		/* "yylval" value */
} comtab[] = {
	"clear",	comnull,	CLEAR,
	"continue",	comnull,	CONTIN,
	"copy",		comnam,		COPY,
	"debug",	comnull,	DEBUG,
	"digits",	comexpr,	DIGITS,
	"drop",		comlist,	DROPC,
	"edit",		comnam,		EDIT,
	"editf",	comnam,		EDITF,
	"write",	comnam,		WRITE,
	"trace",	comnull,	TRACE,
	"untrace",	comnull,	UNTRACE,
	"erase",	comlist,	ERASE,
	"fns",		comnull,	FNS,
	"fuzz",		comexpr,	FUZZ,
	"lib",		comnull,	LIB,
	"load",		comnam,		LOAD,
	"off",		comnull,	OFF,
	"origin",	comexpr,	ORIGIN,
	"read",		comnam,		READ,
	"save",		comnam,		SAVE,
	"vars",		comnull,	VARS,
	"width",	comexpr,	WIDTH,
	"vsave",	comnam,		VSAVE,
	"script",	comnam,		SCRIPT,
	"reset",	comnull,	RESET,
	"si",		comnull,	SICOM,
	"code",		comnam,		CODE,
	"del",		comnam,		DEL,
	"shell",	comnull,	SHELL,
	"list",		comnam,		LIST,
	"prws",		comnull,	PRWS,
	0,		unk
};

/*
 * List of two-character escapes.  Indexed by 02XX entries
 * in "tab", above.  Entries must be in lexical order, i.e.
 * 'V~' will work, '~V' will not (since overstrikes are
 * sorted before they are looked up).  'V~' is 6 down in
 * the table, and thus corresponds to 0206,
 * which "tab" shows to be NOR.
 */
int     chartab[] = {

	'-/',		/* 0200 comprs */
	'-\\',		/* 0201 expand */
	'\'L',		/* 0202 quote quad */
	'LO',		/* 0203 circle quad */
	'CJ',		/* 0204 lamp */
	'^~',		/* 0205 nand */
	'V~',		/* 0206 nor */
	'*O',		/* 0207 log */
	'\'.',		/* 0210 comb/fact ('!') */
	'-O',		/* 0211 rotate */
	'O\\',		/* 0212 transpose */
	'BN',		/* 0213 i beam */
	'%L',		/* 0214 domino */
	'A|',		/* 0215 grade up */
	'V|',		/* 0216 grade dn */
	'O|',		/* 0217 rotate */
	'<=',		/* 0220 less eq */
	'=>',		/* 0221 greater eq */
	'/=',		/* 0222 not eq */
	'A~',		/* 0223 nand */
	'Q~',		/* 0224 nor */
	'/\\',		/* 0225 multiply */
	'-:',		/* 0226 divide */
	'H|',		/* 0227 another grade up */
	'G|',		/* 0230 another dgrade dn */
	'&~',		/* 0231 yet another nand */
	'U|',		/* 0232 PSI */
	'C|',		/* 0233 ISP */
	'Y~',		/* 0234 bracket 1 */
	'U~',		/* 0235 bracket 2 */
	'-U',		/* 0236 another bracket 2 */
	'-Y',		/* 0237 another bracket 2 */
	'//',		/* 0240 alternate divide */
	'BJ',		/* 0241 standard execute */
	'JN',		/* 0242 format */
/*
 *	function alpha() in lex.c must be changed whenever this
 *	table is updated.  It must know the index of the alternate
 *	character set (currently 0243)
 */
	'Fa',		/* alternate character set */
	'Fb',
	'Fc',
	'Fd',
	'Fe',
	'Ff',
	'Fg',
	'Fh',
	'Fi',
	'Fj',
	'Fk',
	'Fl',
	'Fm',
	'Fn',
	'Fo',
	'Fp',
	'Fq',
	'Fr',
	'Fs',
	'Ft',
	'Fu',
	'Fv',
	'Fw',
	'Fx',
	'Fy',
	'Fz',
	0
};

/*
 *	qtab -- table of valid quad functions
 *	the format of the qtab is the similar to tab, above
 *
 */
struct qtab{
	char	*qname;
	int	qtype;
	int	rtype;
} qtab[] = {

	"lx",	XQUAD,	Quad,
	"width", QWID,	Quad,
	"run",	QRUN,	m,
	"fuzz",	QFUZZ,	Quad,
	"fork",	QFORK,	m,
	"wait",	QWAIT,	m,
	"exec",	QEXEC,	m,
	"cr",	QCRP,	m,
	"fx",	FDEF,	m,
	"exit",	QEXIT,	m,
	"pipe",	QPIPE,	m,
	"chdir",QCHDIR,	m,
	"open",	QOPEN,	d,
	"close", QCLOSE, m,
	"read",	QREAD,	d,
	"write",QWRITE,	d,
	"creat",QCREAT,	d,
	"seek",	QSEEK,	m,
	"kill",	QKILL,	d,
	"rd",	QRD,	m,
	"rm",	QUNLNK,	m,
	"dup",	QDUP,	m,
	"ap",	QAP,	d,
	"rline",QRD,	m,
	"nc",	QNC,	m,
	"sig",	QSIGNL,	d,
	"float",QFLOAT,	m,
	"nl"	,QNL,	m,
	0};
