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