Ejemplo n.º 1
2
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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;
}
Ejemplo n.º 5
0
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;
}
Ejemplo n.º 6
0
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;
}
Ejemplo n.º 7
0
static int pcontinuest (void) {
    int ci;

    ci = Cnew (C_CONTINUE);
    Csetfp (ci, C_NULL);
    Lgtok ();
    GTOKIFEQ (L_SEMI);
    return ci;
}
Ejemplo n.º 8
0
static int pbreakst (void) {
    int bi;

    bi = Cnew (C_BREAK);
    Csetfp (bi, C_NULL);
    Lgtok ();
    GTOKIFEQ (L_SEMI);
    return bi;
}
Ejemplo n.º 9
0
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;
}
Ejemplo n.º 10
0
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;
}
Ejemplo n.º 11
0
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;
}
Ejemplo n.º 12
0
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;
}
Ejemplo n.º 13
0
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;
}
Ejemplo n.º 14
0
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;
}
Ejemplo n.º 15
-1
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;
}