xref: /original-bsd/old/as.vax/asexpr.h (revision d25e1985)
1 /* Copyright (c) 1980 Regents of the University of California */
2 /* "@(#)asexpr.h 4.2 08/15/80" */
3 /*
4  *	Definitions to parse tokens
5  */
6 
7 #define ERROR(string)		yyerror(string); goto errorfix
8 
9 #define peekahead (*tokptr)
10 
11 #define shift 			val = yylex()
12 #define advance 	shift
13 
14 #define shiftover(token)	if (val != token) { \
15 					yyerror("token expected"); \
16 					goto errorfix; \
17 				} \
18 				shift
19 
20 #define advanceover 	shiftover
21 
22 /*
23  *	To speed up the expression processing, we class the input tokens
24  *	into various sets.
25  *
26  *	We don't call the recursive descent expression analyzer if we can
27  *	determine by looking at the next token after the first token in
28  *	an expression that the expression is simple (name, integer or floating
29  *	point value).  Expressions with operators are parsed using the recursive
30  *	descent method.
31  */
32 
33 /*
34  *	Functional forwards for expression utility routines
35  */
36 struct	exp	*combine();
37 struct	exp	*boolterm();
38 struct	exp	*term();
39 struct	exp	*factor();
40 struct	exp	*yukkyexpr();
41 
42 /*
43  *	The set definitions
44  */
45 
46 extern	char	tokensets[(LASTTOKEN) - (FIRSTTOKEN) + 1];
47 
48 #define	LINSTBEGIN	01	/*SEMI, NL, NAME*/
49 #define	EBEGOPS		02	/*LP, MINUS, TILDE*/
50 #define	YUKKYEXPRBEG	04	/*NAME, INSTn, INST0, REG, BFINT*/
51 #define	SAFEEXPRBEG	010	/*INT, FLTNUM*/
52 #define	ADDOPS		020	/*PLUS, MINUS*/
53 #define	BOOLOPS		040	/*IOR, XOR, AND*/
54 #define	MULOPS		0100	/*LSH, RSH, MUL, DIV, TILDE*/
55 
56 #define	INTOKSET(val, set)	(tokensets[(val)] & (set) )
57 
58 #define expr(xp, val) { \
59 	if ( (!INTOKSET(val, EBEGOPS)) && (!INTOKSET(peekahead, ADDOPS+BOOLOPS+MULOPS))) { \
60 		if (INTOKSET(val, YUKKYEXPRBEG)) xp = yukkyexpr(val, yylval); \
61 		else xp = (struct exp *) yylval; \
62 		shift; \
63 	} else { \
64 		val = exprparse(val, ptrloc1xp); \
65 		xp = loc1xp; \
66 	} \
67     }
68 
69 /*
70  *	Registers can be either of the form r0...pc, or
71  *	of the form % <expression>
72  *	NOTE:	Reizers documentation on the assembler says that it
73  *	can be of the form r0 + <expression>.. That's not true.
74  *
75  *	NOTE:	Reizer's yacc grammar would seem to allow an expression
76  *	to be: (This is undocumented)
77  *		a)	a register
78  *		b)	an Instruction (INSTn or INST0)
79  */
80 
81 #define findreg(regno) \
82 	if (val == REG) { \
83 		regno = yylval; \
84 		shift; \
85 	} else \
86 	if (val == REGOP) { \
87 		shift;	/*over the REGOP*/ \
88 		val = funnyreg(val, ptrregno); \
89 	} \
90 	else { ERROR ("register expected"); }
91