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