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