1 /*********************************************************************** 2 * * 3 * This software is part of the ast package * 4 * Copyright (c) 1986-2009 AT&T Intellectual Property * 5 * and is licensed under the * 6 * Common Public License, Version 1.0 * 7 * by AT&T Intellectual Property * 8 * * 9 * A copy of the License is available at * 10 * http://www.opensource.org/licenses/cpl1.0.txt * 11 * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * 12 * * 13 * Information and Software Systems Research * 14 * AT&T Research * 15 * Florham Park NJ * 16 * * 17 * Glenn Fowler <gsf@research.att.com> * 18 * * 19 ***********************************************************************/ 20 #pragma prototyped 21 /* 22 * Glenn Fowler 23 * AT&T Research 24 * 25 * preprocessor lexical analyzer definitions 26 */ 27 28 #ifndef _PPFSM_H 29 #define _PPFSM_H 30 31 #define BITSTATE 16 /* bitsof(state) */ 32 #define BITNONTERM 7 /* bitsof(non-terminal-state) */ 33 #define BITTERM 7 /* bitsof(terminal-state) */ 34 #define NMAC 19 /* number of MAC states */ 35 36 #define SPLICE (1<<BITTERM) 37 38 #define CODE(tok,act) ((((tok)-N_PP)<<(BITTERM+1))|(act)) 39 #define TERM(st) ((st)&((1<<(BITTERM+1))-1)) 40 #define NEXT(st) (((st)>>(BITTERM+1))&((1<<BITNONTERM)-1)) 41 #define QUAL(st) (((st)<<(BITTERM+1))|(S_QUAL)) 42 #define TYPE(st) (NEXT(st)+N_PP) 43 44 #define BACK(tok) CODE(tok,S_TOKB) 45 #define KEEP(tok) CODE(tok,S_TOK) 46 47 #undef MAX 48 #define MAX 255 49 50 #undef EOB 51 #define EOB 0 52 #undef EOF 53 #define EOF (MAX+1) 54 55 /* 56 * FSM states 57 * 58 * NOTE: preserve the ranges 59 */ 60 61 #define INDEX(p) (((p)-fsm[0])/(MAX+1)) 62 63 #define IDSTATE(x) (((x)>=0&&INQMACRO(fsm[x]))?QID:(x)) 64 65 #define INCOMMENT(p) ((p)>=fsm[COM2]&&(p)<=fsm[COM7]) 66 #define INCOMMENTXX(p) ((p)>=fsm[COM5]&&(p)<=fsm[COM7]) 67 #define INQMACRO(p) ((p)>=fsm[MAC0]&&(p)<=fsm[LIT0]) 68 #define INTMACRO(p) ((p)>=fsm[NID]&&(p)<=fsm[LIT]) 69 #define INQUOTE(p) ((p)>=fsm[LIT1]&&(p)<=fsm[LIT2]) 70 #define INOPSPACE(p) ((p)==fsm[BIN1]) 71 #define INSPACE(p) ((p)==fsm[WS1]) 72 73 /* 74 * proto non-terminal states 75 */ 76 77 #define PROTO 0 78 #define RES1 (PROTO+1) 79 #define RES1a (PROTO+2) 80 #define RES1e (PROTO+3) 81 #define RES1f (PROTO+4) 82 #define RES1h (PROTO+5) 83 #define RES1l (PROTO+6) 84 #define RES1n (PROTO+7) 85 #define RES1o (PROTO+8) 86 #define RES1t (PROTO+9) 87 #define RES1x (PROTO+10) 88 #define RES1y (PROTO+11) 89 #define COM1 (PROTO+12) 90 #define COM2 (PROTO+13) 91 #define COM3 (PROTO+14) 92 #define COM4 (PROTO+15) 93 #define COM5 (PROTO+16) 94 #define COM6 (PROTO+17) 95 #define COM7 (PROTO+18) 96 #define NID (PROTO+19) 97 #define LIT (PROTO+20) 98 #define LIT1 (PROTO+21) 99 #define LIT2 (PROTO+22) 100 #define BAD1 (PROTO+23) 101 #define BAD2 (PROTO+24) 102 #define DOT (PROTO+25) 103 #define DOT2 (PROTO+26) 104 #define WS1 (PROTO+27) 105 106 #if PROTOMAIN 107 108 #define TERMINAL (PROTO+28) /* PROTOMAIN */ 109 110 #else 111 112 /* 113 * quick non-terminal states 114 */ 115 116 #define QUICK (PROTO+28) 117 #define QTOK (QUICK+1) 118 #define QNUM (QUICK+2) 119 #define QEXP (QUICK+3) 120 #define QCOM (QUICK+4) 121 #define QID (QUICK+5) 122 #define MAC0 (QUICK+6) 123 #define MACN (MAC0+NMAC-1) 124 #define HIT0 (MACN+1) 125 #define HITN (HIT0+NMAC-1) 126 #define LIT0 (HITN+1) 127 #define SHARP1 (HITN+2) 128 129 /* 130 * tokenize non-terminal states 131 */ 132 133 #define TOKEN (HITN+3) 134 #define OCT1 (TOKEN+1) 135 #define OCT2 (TOKEN+2) 136 #define OCT3 (TOKEN+3) 137 #define NOT1 (TOKEN+4) 138 #define PCT1 (TOKEN+5) 139 #define AND1 (TOKEN+6) 140 #define STAR1 (TOKEN+7) 141 #define PLUS1 (TOKEN+8) 142 #define MINUS1 (TOKEN+9) 143 #define ARROW1 (TOKEN+10) 144 #define COLON1 (TOKEN+11) 145 #define LT1 (TOKEN+12) 146 #define LSH1 (TOKEN+13) 147 #define EQ1 (TOKEN+14) 148 #define RSH1 (TOKEN+15) 149 #define GT1 (TOKEN+16) 150 #define CIRC1 (TOKEN+17) 151 #define OR1 (TOKEN+18) 152 #define DEC1 (TOKEN+19) 153 #define DEC2 (TOKEN+20) 154 #define HEX1 (TOKEN+21) 155 #define HEX2 (TOKEN+22) 156 #define HEX3 (TOKEN+23) 157 #define HEX4 (TOKEN+24) 158 #define HEX5 (TOKEN+25) 159 #define HEX6 (TOKEN+26) 160 #define HEX7 (TOKEN+27) 161 #define HEX8 (TOKEN+28) 162 #define DBL1 (TOKEN+29) 163 #define DBL2 (TOKEN+30) 164 #define DBL3 (TOKEN+31) 165 #define DBL4 (TOKEN+32) 166 #define DBL5 (TOKEN+33) 167 #define DOT1 (TOKEN+34) 168 #define HDR1 (TOKEN+35) 169 #define BIN1 (TOKEN+36) 170 171 #define TERMINAL (TOKEN+37) 172 173 #endif 174 175 /* 176 * quick terminal states grouped together 177 */ 178 179 #define S_CHRB (TERMINAL+0) 180 #define S_COMMENT (TERMINAL+1) 181 #define S_EOB (TERMINAL+2) 182 #define S_LITBEG (TERMINAL+3) 183 #define S_LITEND (TERMINAL+4) 184 #define S_LITESC (TERMINAL+5) 185 #define S_MACRO (TERMINAL+6) 186 #define S_NL (TERMINAL+7) 187 #define S_QUAL (TERMINAL+8) 188 #define S_SHARP (TERMINAL+9) 189 #define S_VS (TERMINAL+10) 190 191 /* 192 * and the remaining terminal states 193 */ 194 195 #define S_CHR (TERMINAL+11) 196 #define S_HUH (TERMINAL+12) 197 #define S_TOK (TERMINAL+13) 198 #define S_TOKB (TERMINAL+14) 199 #define S_WS (TERMINAL+15) 200 201 #define S_RESERVED (S_HUH) 202 203 /* 204 * the last terminal state (for tracing) 205 */ 206 207 #define LAST (S_WS) 208 209 /* 210 * pseudo terminal states 211 */ 212 213 #define S_EOF (0) 214 215 /* 216 * common lex macros 217 * 218 * NOTE: common local variable names assumed 219 */ 220 221 #define GET(p,c,tp,xp) \ 222 do \ 223 { \ 224 if ((c = GETCHR()) == EOB && pp.in->type == IN_FILE) \ 225 FGET(p, c, tp, xp); \ 226 } while (0) 227 228 #define FGET(p,c,tp,xp) \ 229 do \ 230 { \ 231 if (op > xp + PPTOKSIZ) \ 232 { \ 233 if (!INCOMMENT(rp) && !(pp.state & (NOTEXT|SKIPCONTROL))) \ 234 error(2, "long token truncated"); \ 235 op = xp + PPTOKSIZ; \ 236 } \ 237 if ((pp.in->flags & IN_flush) && pp.level == 1 && !INMACRO(rp) && (!pp.comment || !INCOMMENT(rp)) && (c = op - pp.outbuf) > 0 && *(op - 1) == '\n') \ 238 { \ 239 PPWRITE(c); \ 240 op = tp = pp.outp = pp.outbuf; \ 241 } \ 242 SYNCIN(); \ 243 refill(p); \ 244 CACHEIN(); \ 245 if ((c = GETCHR()) == EOB) BACKIN(); \ 246 } while (0) 247 248 #define POP() \ 249 do \ 250 { \ 251 debug((-7, "POP in=%s next=%s state=%s", ppinstr(cur), pptokchr(*prv->nextchr), pplexstr(INDEX(rp)))); \ 252 ip = (pp.in = prv)->nextchr; \ 253 } while (0) 254 255 /* 256 * fsm implementaion globals 257 */ 258 259 #define fsm _pp_fsmtab 260 #define refill _pp_refill 261 #define trigraph _pp_trigraph 262 263 /* 264 * first index is state, second is char, value is next state 265 * except for fsm[TERMINAL] where second is state+1 for EOF transition 266 */ 267 268 extern short fsm[TERMINAL+1][MAX+1]; 269 270 /* 271 * the index is char, value is trigraph value for <?><?><char>, 0 if invalid 272 */ 273 274 extern char trigraph[MAX+1]; 275 276 extern void refill(int); 277 278 #endif 279