static int pstmt (void) { int si, i0, i1; si = Cnew (C_STMT); switch (Ltok) { case L_SEMI: Csetfp (si, C_NULL); Lgtok (); break; case L_LCB: Lgtok (); if (Ltok == L_RCB) { Csetfp (si, C_NULL); } else { i1 = pstmt (); Csetfp (si, i1); i0 = i1; while (Ltok != L_RCB) { i1 = pstmt (); Csetnext (i0, i1); i0 = i1; } } Lgtok (); break; case L_IF: i0 = pifst (); Csetfp (si, i0); break; case L_WHILE: i0 = pwhilest (); Csetfp (si, i0); break; case L_FOR: i0 = pforst (); Csetfp (si, i0); break; case L_BREAK: i0 = pbreakst (); Csetfp (si, i0); break; case L_CONTINUE: i0 = pcontinuest (); Csetfp (si, i0); break; case L_RETURN: i0 = preturnst (); Csetfp (si, i0); break; default: i0 = pexpr (); Csetfp (si, i0); GTOKIFEQ (L_SEMI); } return si; }
static int pifst (void) { int isi, ii, ti, ei; if ((isi = EEcnew (C_IF)) == -1) { SUwarning (0, "pifst", "cannot create statement"); return -1; } EElgtok (); GTOKIFEQ (L_LP); if ((ii = pexpr ()) == -1) { SUwarning (0, "pifst", "cannot create expression"); return -1; } EEcsetfp (isi, ii); GTOKIFEQ (L_RP); if ((ti = pstmt ()) == -1) { SUwarning (0, "pifst", "cannot create then statement"); return -1; } EEcsetnext (ii, ti); if (EEltok == L_ELSE) { EElgtok (); if ((ei = pstmt ()) == -1) { SUwarning (0, "pifst", "cannot create else statement"); return -1; } EEcsetnext (ti, ei); } return isi; }
static int pforst (void) { int fi, i0, i1, si; fi = Cnew (C_FOR); Lgtok (); GTOKIFEQ (L_LP); i0 = (Ltok == L_SEMI) ? Cnew (C_NOP): pexpr (); Csetfp (fi, i0); if (Ltok == L_IN) { Csettype (fi, C_FORIN); Lgtok (); i1 = pexpr (); Csetnext (i0, i1); i0 = i1; } else { GTOKIFEQ (L_SEMI); i1 = (Ltok == L_SEMI) ? Cnew (C_NOP): pexpr (); Csetnext (i0, i1); i0 = i1; GTOKIFEQ (L_SEMI); i1 = (Ltok == L_SEMI) ? Cnew (C_NOP): pexpr (); Csetnext (i0, i1); i0 = i1; } GTOKIFEQ (L_RP); si = pstmt (); Csetnext (i0, si); return fi; }
static int ptcons (void) { int ti, ei0, ei1; ti = Cnew (C_TCONS); Lgtok (); if (Ltok == L_RB) { Csetfp (ti, C_NULL); Lgtok (); return ti; } ei1 = pexpi (0); Csetfp (ti, ei1); ei0 = ei1; GTOKIFEQ (L_ASSIGN); ei1 = pexpr (); Csetnext (ei0, ei1); ei0 = ei1; GTOKIFEQ (L_SEMI); while (Ltok != L_RB) { ei1 = pexpi (0); Csetnext (ei0, ei1); ei0 = ei1; GTOKIFEQ (L_ASSIGN); ei1 = pexpr (); Csetnext (ei0, ei1); ei0 = ei1; GTOKIFEQ (L_SEMI); } Lgtok (); return ti; }
static int pwhilest (void) { int wi, ei, si; wi = Cnew (C_WHILE); Lgtok (); GTOKIFEQ (L_LP); ei = pexpr (); Csetfp (wi, ei); GTOKIFEQ (L_RP); si = pstmt (); Csetnext (ei, si); return wi; }
static int preturnst (void) { int ri, ei; ri = Cnew (C_RETURN); Lgtok (); if (Ltok == L_SEMI) { Csetfp (ri, C_NULL); GTOKIFEQ (L_SEMI); return ri; } ei = pexpr (); Csetfp (ri, ei); GTOKIFEQ (L_SEMI); return ri; }
static int pcontinuest (void) { int ci; ci = Cnew (C_CONTINUE); Csetfp (ci, C_NULL); Lgtok (); GTOKIFEQ (L_SEMI); return ci; }
static int pbreakst (void) { int bi; bi = Cnew (C_BREAK); Csetfp (bi, C_NULL); Lgtok (); GTOKIFEQ (L_SEMI); return bi; }
static int pifst (void) { int isi, ii, ti, ei; isi = Cnew (C_IF); Lgtok (); GTOKIFEQ (L_LP); ii = pexpr (); Csetfp (isi, ii); GTOKIFEQ (L_RP); ti = pstmt (); Csetnext (ii, ti); if (Ltok == L_ELSE) { Lgtok (); ei = pstmt (); Csetnext (ti, ei); } return isi; }
static int pexp7 (void) { int ei0, ei1, ei2; ei0 = 0; switch (Ltok) { case L_FUNCTION: Lgtok (); ei0 = pfunc (); break; case L_LP: ei0 = Cnew (C_PEXPR); Lgtok (); ei1 = pexpr (); GTOKIFEQ (L_RP); Csetfp (ei0, ei1); break; case L_LB: ei0 = ptcons (); break; case L_STRING: case L_NUMBER: ei0 = pcons (); break; case L_ID: ei0 = pvar (); if (Ltok == L_LP) { /* ie: it's really a function call */ ei1 = ei0; ei0 = Cnew (C_FCALL); Csetfp (ei0, ei1); Lgtok (); ei2 = pargs (); Csetnext (ei1, ei2); GTOKIFEQ (L_RP); } break; default: err ("expected EXP7 type token, found: %s", Lnames[Ltok]); } return ei0; }
static int pstmt (void) { int si, si0, si1; if ((si = EEcnew (C_STMT)) == -1) { SUwarning (0, "pstmt", "cannot create statement"); return -1; } switch (EEltok) { case L_SEMI: EEcsetfp (si, C_NULL); EElgtok (); break; case L_LCB: EElgtok (); if (EEltok == L_RCB) { EEcsetfp (si, C_NULL); } else { if ((si1 = pstmt ()) == -1) { SUwarning (0, "pstmt", "cannot create compound statement"); return -1; } EEcsetfp (si, si1); si0 = si1; while (EEltok != L_RCB) { if ((si1 = pstmt ()) == -1) { SUwarning (0, "pstmt", "cannot create compound statement"); return -1; } EEcsetnext (si0, si1); si0 = si1; } } EElgtok (); break; case L_IF: if ((si0 = pifst ()) == -1) { SUwarning (0, "pstmt", "cannot create if statement"); return -1; } EEcsetfp (si, si0); break; default: if ((si0 = pexpr ()) == -1) { SUwarning (0, "pstmt", "cannot create expression"); return -1; } EEcsetfp (si, si0); GTOKIFEQ (L_SEMI); } return si; }
static int pargs (void) { int ai, ei0, ei1; ai = Cnew (C_ARGS); if (Ltok == L_RP) { Csetfp (ai, C_NULL); return ai; } ei0 = pexpr (); Csetfp (ai, ei0); while (Ltok != L_RP) { GTOKIFEQ (L_COMMA); if (Ltok == L_RP) err ("expected expression, found: %s", Lnames[Ltok]); ei1 = pexpr (); Csetnext (ei0, ei1); ei0 = ei1; } return ai; }
static int pexp7 (void) { int ei0, ei1; switch (EEltok) { case L_LP: if ((ei0 = EEcnew (C_PEXPR)) == -1) { SUwarning (0, "pexp7", "cannot create code"); return -1; } EElgtok (); if ((ei1 = pexpr ()) == -1) { SUwarning (0, "pexp7", "cannot create expression"); return -1; } GTOKIFEQ (L_RP); EEcsetfp (ei0, ei1); break; case L_STRING: case L_NUMBER: if ((ei0 = pcons ()) == -1) { SUwarning (0, "pexp7", "cannot create constant expression"); return -1; } break; case L_ID: if ((ei0 = pvar ()) == -1) { SUwarning (0, "pexp7", "cannot create variable expression"); return -1; } break; default: SUwarning ( 0, "pexp7", "unexpected token: %s, string: %s", EElnames[EEltok], EElgetstr () ); } return ei0; }
static int pvar (void) { int vi, ci0, ci1, i; vi = Cnew (C_GVAR); ci0 = Cstring (Lstrtok); Csetfp (vi, ci0); for (i = flvi; i < llvi; i++) { if (strcmp (GETLVSTR (i), Lstrtok) == 0) { Csettype (vi, C_LVAR); ci1 = Cinteger ((long) GETLVNUM (i)); Csetnext (ci0, ci1); ci0 = ci1; break; } } Lgtok (); if (Ltok != L_DOT && Ltok != L_LB) return vi; while (Ltok == L_DOT || Ltok == L_LB) { if (Ltok == L_DOT) { Lgtok (); if (Ltok != L_ID) err ("expected identifier, found: %s", Lnames[Ltok]); ci1 = Cstring (Lstrtok); Csetnext (ci0, ci1); Lgtok (); } else { Lgtok (); ci1 = pexpr (); Csetnext (ci0, ci1); GTOKIFEQ (L_RB); } ci0 = ci1; } return vi; }
static int pfunc (void) { int fi, di, si, ifi, ifn, ldi, i, li1, li2; int owncbufi, ownflvi, ownllvi, flvn, ifnum; owncbufi = Cgetindex (); ownflvi = flvi, ownllvi = llvi; flvi = llvi; flvn = 0; fi = Cnew (C_FUNCTION); GTOKIFEQ (L_LP); li1 = Cinteger (0); Csetfp (fi, li1); li2 = Cinteger (0); Csetnext (li1, li2); di = pdecl (&flvn); Csetnext (li2, di); i = di; GTOKIFEQ (L_RP); if (Ltok == L_INTERNAL) { Lgtok (); if (Ltok == L_STRING) { if ((ifnum = Igetfunc (Lstrtok)) == -1) err ("no such internal function: %s", Lstrtok); ifi = Cnew (C_INTERNAL); ifn = Cinteger ((long) ifnum); Csetfp (ifi, ifn); Csetnext (i, ifi); Lgtok (); } else err ("expected token: STRING, found: '%s'", Lnames[Ltok]); } else { GTOKIFEQ (L_LCB); while (Ltok == L_LOCAL) { Lgtok (); ldi = pdecl (&flvn); Csetnext (i, ldi); i = ldi; GTOKIFEQ (L_SEMI); } while (Ltok != L_RCB) { si = pstmt (); Csetnext (i, si); i = si; } GTOKIFEQ (L_RCB); } Csetinteger (li1, (long) (Cgetindex () - owncbufi)); Csetinteger (li2, (long) flvn); flvi = ownflvi, llvi = ownllvi; return fi; }