static int pexpi (int k) { int ei0, ei1, ei2, ptok; if (lextab[k][0] == 0) return pexp5 (); if ((ei0 = pexpi (k + 1)) == -1) { SUwarning (0, "pexpi", "cannot create first expression"); return -1; } while ((ptok = getop (EEltok, k)) != -1) { if ((ei1 = EEcnew (ptok)) == -1) { SUwarning (0, "pexpi", "cannot create code"); return -1; } EEcsetfp (ei1, ei0); EElgtok (); if ((ei2 = pexpi (k + 1)) == -1) { SUwarning (0, "pexpi", "cannot create next expression"); return -1; } EEcsetnext (ei0, ei2); ei0 = ei1; } return ei0; }
static void pobject(int d, js_Ast *list) { ps("{"); while (list) { js_Ast *kv = list->a; assert(list->type == AST_LIST); switch (kv->type) { case EXP_PROP_VAL: pexpi(d, COMMA, kv->a); ps(": "); pexpi(d, COMMA, kv->b); break; case EXP_PROP_GET: ps("get "); pexpi(d, COMMA, kv->a); ps("() {\n"); pstmlist(d, kv->c); in(d); ps("}"); break; case EXP_PROP_SET: ps("set "); pexpi(d, COMMA, kv->a); ps("("); pargs(d, kv->b); ps(") {\n"); pstmlist(d, kv->c); in(d); ps("}"); break; } list = list->b; if (list) ps(", "); } ps("}"); }
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 pexpi (int k) { int ei0, ei1, ei2, ptok; if (lextab[k][0] == 0) return pexp5 (); ei0 = pexpi (k + 1); while ((ptok = getop (Ltok, k)) != -1) { ei1 = Cnew (ptok); Csetfp (ei1, ei0); Lgtok (); ei2 = pexpi (k + 1); Csetnext (ei0, ei2); ei0 = ei1; } return ei0; }
static void pargs(int d, js_Ast *list) { while (list) { assert(list->type == AST_LIST); pexpi(d, COMMA, list->a); list = list->b; if (list) ps(", "); } }
static int pexpr (void) { int ai, ei0, ei1; ei0 = pexpi (0); if (Ltok != C_ASSIGN) return ei0; ai = Cnew (C_ASSIGN); Csetfp (ai, ei0); Lgtok (); ei1 = pexpr (); Csetnext (ei0, ei1); return ai; }
static int pexpr (void) { int ai, ei0, ei1; if ((ei0 = pexpi (0)) == -1) { SUwarning (0, "pexpr", "cannot create lhs expression"); return -1; } if (EEltok != C_ASSIGN) return ei0; if ((ai = EEcnew (C_ASSIGN)) == -1) { SUwarning (0, "pexpr", "cannot create rhs code"); return -1; } EEcsetfp (ai, ei0); EElgtok (); if ((ei1 = pexpr ()) == -1) { SUwarning (0, "pexpr", "cannot create rhs expression"); return -1; } EEcsetnext (ei0, ei1); return ai; }