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()
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()
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()
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()
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()
def expr(): if SC.sym not in FIRSTEXPR: mark('invalid expr first token') and_expr() while SC.sym == OR: getSym() and_expr()
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()
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()
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')
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()
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")
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")
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')
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")
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")
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")
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()
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 ')'")
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 ']'")
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')
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")