示例#1
0
def unary_expr():
    if SC.sym not in FIRSTUNARY_EXPR:
        mark('invalid unary_expr first token')

    if SC.sym in {PLUS, MINUS, NOT}:
        getSym()

    post_expr()
示例#2
0
def rltn_expr():
    if SC.sym not in FIRSTRLTN_EXPR:
        mark('invalid rltn_expr first token')

    add_expr()

    while SC.sym in {LT, GT, LE, GE}:
        getSym()
        add_expr()
示例#3
0
def add_expr():
    if SC.sym not in FIRSTADD_EXPR:
        mark('invalid add_expr first token')

    mult_expr()

    while SC.sym in {PLUS, MINUS}:
        getSym()
        mult_expr()
示例#4
0
def mult_expr():
    if SC.sym not in FIRSTMULT_EXPR:
        mark('invalid mult_expr first token')

    cast_expr()

    while SC.sym in {MULT, DIV, MOD}:
        getSym()
        cast_expr()
示例#5
0
def and_expr():
    if SC.sym not in FIRSTAND_EXPR:
        mark('invalid and_expr first token')

    eqlty_expr()

    while SC.sym == AND:
        getSym()
        eqlty_expr()
示例#6
0
def expr():
    if SC.sym not in FIRSTEXPR:
        mark('invalid expr first token')

    and_expr()

    while SC.sym == OR:
        getSym()
        and_expr()
示例#7
0
def cast_expr():
    if SC.sym not in FIRSTCAST_EXPR:
        mark('invalid cast_expr first token')

    if SC.sym in {INT, FLOAT, STRING, BOOL}:
        getSym()

        if SC.sym == COLON: getSym()
        else: mark("cast expects ':'")

    unary_expr()
示例#8
0
def eqlty_expr():
    if SC.sym not in FIRSTEQLTY_EXPR:
        if SC.sym == EQ:
            mark("assignment requires ':='")
        else:
            mark('invalid eqlty_expr first token')

    rltn_expr()

    while SC.sym in {EQ, NE}:
        getSym()
        rltn_expr()
示例#9
0
def stmt_list():
    if SC.sym not in FIRSTSTMT_LIST:
        mark('invalid stmt_list first token')

    while SC.sym in {LINEEND} | FIRSTSTMT:
        if SC.sym in FIRSTSTMT:
            stmt()

        elif SC.sym == LINEEND:
            getSym()

        else:
            mark('unknown statement strt')
示例#10
0
def post_expr():
    if SC.sym not in FIRSTPOST_EXPR:
        mark('invalid post_expr first token')

    prime_expr()

    while SC.sym in {INCC, DECC} | FIRSTPARAMS | FIRSTSELECTOR:
        if SC.sym in {INCC, DECC}:
            getSym()
        elif SC.sym in FIRSTPARAMS:
            params()
        elif SC.sym in FIRSTSELECTOR:
            selector()
示例#11
0
def func_stmt():
    if SC.sym not in FIRSTFUNC_STMT:
        mark('invalid func_stmt first token')

    if SC.sym == FUNCTION: getSym()
    else: mark("expected 'define'")

    if SC.sym == IDENT: getSym()
    else: mark("expected identifier")

    if SC.sym in FIRSTPARAMS: params()
    else: mark("expected parameters")

    if SC.sym in FIRSTSTMT: stmt()
    else: mark("expected statement")
示例#12
0
def program():
    if SC.sym not in FIRSTPROGRAM:
        mark('invalid program first token')

    if SC.sym == PROGRAM: getSym()
    else: mark("expected 'program'")

    if SC.sym == IDENT: getSym()
    else: mark("expected identifier")

    if SC.sym in FIRSTPARAMS: params()
    else: mark("expected parameters")

    if SC.sym in FIRSTSTMT: stmt()
    else: mark("expected statement")
示例#13
0
def cplx_stmt():
    if SC.sym not in FIRSTCPLX_STMT:
        mark('invalid cplx_stmt first token')

    if SC.sym == DO: getSym()
    else: mark("expected 'do'")

    if SC.sym == LINEEND: getSym()
    else: mark("expected newline")

    stmt_list()

    if SC.sym == END: getSym()
    else: mark("expected 'end'")

    if SC.sym == LINEEND: getSym()
    else: mark("expected newline")
示例#14
0
def stmt():
    if SC.sym not in FIRSTSTMT:
        mark('invalid stmt first token')

    if SC.sym in FIRSTCPLX_STMT:
        cplx_stmt()
    elif SC.sym in FIRSTEXPR_STMT:
        expr_stmt()
    elif SC.sym in FIRSTITER_STMT:
        iter_stmt()
    elif SC.sym in FIRSTSLCT_STMT:
        slct_stmt()
    elif SC.sym in FIRSTFUNC_STMT:
        func_stmt()
    elif SC.sym in FIRSTRETN_STMT:
        retn_stmt()
    elif SC.sym in FIRSTOUTP_STMT:
        outp_stmt()
示例#15
0
def prime_expr():
    if SC.sym not in FIRSTPRIME_EXPR:
        mark('invalid prime_expr first token')

    if SC.sym == IDENT:
        getSym()
    elif SC.sym == INTEGER:
        getSym()
    elif SC.sym == REAL:
        getSym()
    elif SC.sym == STRING_LITERAL:
        getSym()
    elif SC.sym == LPAREN:
        getSym()

        expr()

        if SC.sym == COMMA:
            getSym()
            expr()

        if SC.sym == RPAREN: getSym()
        else: mark("expected ')'")

    else:
        mark('expected expression')
示例#16
0
def params():
    if SC.sym not in FIRSTPARAMS:
        mark('invalid selector first token')

    if SC.sym == LPAREN: getSym()
    else: mark("expected '('")

    if SC.sym in FIRSTEXPR:
        expr()
        while SC.sym == COMMA:
            getSym()
            if SC.sym in FIRSTEXPR: expr()
            else: mark("expected expression")

    if SC.sym == RPAREN: getSym()
    else: mark("expected ')'")
示例#17
0
def selector():
    if SC.sym not in FIRSTSELECTOR:
        mark('invalid selector first token')

    if SC.sym == LBRAK: getSym()
    else: mark("expected '['")

    if SC.sym in FIRSTEXPR:
        expr()
        while SC.sym == COMMA:
            getSym()
            if SC.sym in FIRSTEXPR: expr()
            else: mark("expected expression")

    if SC.sym == RBRAK: getSym()
    else: mark("expected ']'")
示例#18
0
def expr_stmt():
    if SC.sym not in FIRSTEXPR_STMT:
        mark('invalid expr_stmt first token')

    assignment = False
    if SC.sym in FIRSTPOST_EXPR:
        post_expr()

        if SC.sym == BECOMES:
            getSym()
            assignment = True

    if assignment:
        expr()

        if SC.sym == LINEEND: getSym()
        else: mark("expected newline")
    else:
        if SC.sym in BINARYOP:
            # MIDWAY THROUGH EXPR, NEED TO PICKUP
            # ASK: May break operator precidence
            if SC.sym in {OR}:
                expr()
            elif SC.sym in {AND}:
                and_expr()
            elif SC.sym in {EQ, NE}:
                eqlty_expr()
            elif SC.sym in {LT, GT, LE, GE}:
                rltn_expr()
            elif SC.sym in {PLUS, MINUS}:
                add_expr()
            elif SC.sym in {MULT, DIV, MOD}:
                mult_expr()
            else:
                mark('expected binary operator')

        elif SC.sym == LINEEND:
            # IF EXPRESSION IS A PRIME_EXPR w/ POSTFIX
            pass

        else:
            mark('unknown expression state')
示例#19
0
def outp_stmt():
    if SC.sym not in FIRSTOUTP_STMT:
        mark('invalid outp_stmt first token')

    if SC.sym == OUTPUT: getSym()
    else: mark("expected 'output'")

    # errOpen = False
    # if SC.sym == LPAREN: getSym()
    # else: mark("output statement expects '('"); errOpen = True

    if SC.sym in FIRSTEXPR: expr()
    else: mark("expected expression")

    # if SC.sym == RPAREN: getSym()
    # else:
    #     if not errOpen: mark("expected ')'")

    if SC.sym == LINEEND: getSym()
    else: mark("expected newline")
示例#20
0
def retn_stmt():
    if SC.sym not in FIRSTRETN_STMT:
        mark('invalid retn_stmt first token')

    if SC.sym == RETURN: getSym()
    else: mark("expected 'return'")

    # if SC.sym == LPAREN:
    #     getSym()

    if SC.sym in FIRSTEXPR:
        expr()

        # if SC.sym == RPAREN: getSym()
        # else: mark("expected ')'")

    elif SC.sym != LINEEND:
        mark('return bracketed expression or none')

    # if SC.sym == LINEEND: getSym()
    else:
        pass  #mark("expected newline")
示例#21
0
def slct_stmt():
    if SC.sym not in FIRSTSLCT_STMT:
        mark('invalid slct_stmt first token')

    if SC.sym == IF: getSym()
    else: mark("expected 'if'")

    if SC.sym == LPAREN: getSym()
    else: mark("if statement expects '('")

    if SC.sym in FIRSTEXPR: expr()
    else: mark("expected expression")

    if SC.sym == RPAREN: getSym()
    else: mark("expected ')'")

    if SC.sym == LINEEND: getSym()
    else:
        if SC.sym in FIRSTSTMT: mark("expected stmt on newline")
        else: mark("expected newline")

    stmt()

    if SC.sym == ELSE:
        getSym()

        if SC.sym == LINEEND: getSym()
        else:
            if SC.sym in FIRSTSTMT: mark("expected stmt on newline")
            else: mark("expected newline")

        if SC.sym in FIRSTSTMT: stmt()
        else: mark("expected statement")
示例#22
0
def iter_stmt():
    if SC.sym not in FIRSTITER_STMT:
        mark('invalid iter_stmt first token')

    if SC.sym == WHILE: getSym()
    else: mark("expected 'while'")

    if SC.sym == LPAREN: getSym()
    else: mark("while statement expects '('")

    if SC.sym in FIRSTEXPR: expr()
    else: mark("expected expression")

    if SC.sym == RPAREN: getSym()
    else: mark("expected ')'")

    if SC.sym == LINEEND: getSym()
    else:
        if SC.sym in FIRSTSTMT: mark("expected stmt on newline")
        else: mark("expected newline")

    stmt()