def p_arglist(p): """arglist : arglist COMMA atom | atom""" if len(p) == 4: p[0] = Node("arglist", [p[1], p[3]]) elif len(p) == 2: p[0] = Node("arglist", [p[1]])
def p_strip(p): """strip : STRIP LPAREN atom COMMA atom RPAREN | STRIP LPAREN atom RPAREN""" if len(p) == 7: p[0] = Node("strip", [p[3], p[5]], None, "%s.strip(%s)") else: p[0] = Node("strip", [p[3]], None, "%s.strip()")
def p_program(p): """program : program stmt_list | stmt_list""" if len(p) == 3: p[0] = Node("program", [p[1], p[2]]) elif len(p) == 2: p[0] = Node("program", [p[1]])
def p_pop(p): """pop : POP LPAREN atom RPAREN | POP LPAREN atom COMMA atom RPAREN""" if len(p) == 5: p[0] = Node("pop", [p[3]], None, "%s.pop()") elif len(p) == 7: p[0] = Node("pop", [p[3], p[5]], None, "%s.pop(%s)")
def p_stmt_list(p): """stmt_list : stmt_list stmt | stmt""" if len(p) == 3: p[0] = Node("stmt_list", [p[1], p[2]]) elif len(p) == 2: p[0] = Node("stmt_list", [p[1]])
def p_list_body(p): """list_body : list_body list_item | list_item""" if len(p) == 2: p[0] = Node("list_body", [p[1]]) elif len(p) == 3: p[0] = Node("list_body", [p[1], p[2]])
def p_list(p): """list : LBRACKET RBRACKET | LBRACKET list_body RBRACKET""" if len(p) == 3: p[0] = Node("list", None, "[]") elif len(p) == 4: p[0] = Node("list", [p[2]])
def p_return_jump_stmt(p): """return_jump_stmt : RETURN expr | RETURN""" if len(p) == 3: p[0] = Node("return", [p[2]], None, "return %s") elif len(p) == 2: p[0] = Node("return", None, "return")
def p_for_stmt(p): """for_stmt : FOR ID IN atom stmt | FOR ID IN atom LBRACE stmt_list RBRACE""" if len(p) == 6: p[0] = Node("for", [p[4], p[5]], p[2]) elif len(p) == 8: p[0] = Node("for", [p[4], p[6]], p[2])
def p_while_stmt(p): """while_stmt : WHILE expr stmt | WHILE expr LBRACE stmt_list RBRACE""" if len(p) == 4: p[0] = Node("while", [p[2], p[3]]) elif len(p) == 6: p[0] = Node("while", [p[2], p[4]])
def p_read_stmt(p): """read_stmt : READ LPAREN atom RPAREN | READ LPAREN RPAREN""" if len(p) == 5: p[0] = Node("read_stmt", [p[3]], None, "input(%s)") elif len(p) == 4: p[0] = Node("read_stmt", None, "input()")
def p_convertdist(p): """convertdist : CONVERTDIST LPAREN atom COMMA atom COMMA atom RPAREN | CONVERTDIST LPAREN atom COMMA atom RPAREN""" if len(p) == 9: p[0] = Node("convertdist", [p[3], p[5], p[7]], None, "convertdist(%s, %s, %s)") elif len(p) == 7: p[0] = Node("convertdist", [p[3], p[5]], None, "convertdist(%s, %s)")
def p_def_fn(p): """def_fn : ID LPAREN RPAREN | ID LPAREN arglist RPAREN | ID COORD""" if len(p) == 4: value = (p[1], ) p[0] = Node("def_fn", None, value) elif len(p) == 5: p[0] = Node("def_fn", [p[3]], p[1]) elif len(p) == 3: # COORD hack value = (p[1], p[2]) p[0] = Node("def_fn", None, value)
def p_elif_block(p): """elif_block : elif_block ELIF expr LBRACE stmt_list RBRACE | ELIF expr LBRACE stmt_list RBRACE | elif_block ELIF expr stmt | ELIF expr stmt""" if len(p) == 7: p[0] = Node("elif_block_brace", [p[1], p[3], p[5]]) if len(p) == 6: p[0] = Node("elif_block_brace", [p[2], p[4]]) if len(p) == 5: p[0] = Node("elif_block_simple", [p[1], p[3], p[4]]) if len(p) == 4: p[0] = Node("elif_block_simple", [p[2], p[3]])
def p_str_fn(p): """str_fn : len | split | strip | str | join""" p[0] = Node("str_fn", [p[1]])
def p_assign_stmt(p): """assign_stmt : arglist EQUALS expr | arglist TIMESEQUAL expr | arglist DIVEQUAL expr | arglist MODEQUAL expr | arglist PLUSEQUAL expr | arglist MINUSEQUAL expr""" p[0] = Node("assign_stmt", [p[1], p[3]], p[2])
def p_double_stmt(p): """ double_stmt : ID MINUSMINUS %prec MINUSMINUS | ID PLUSPLUS %prec PLUSPLUS""" if p[2] == "++": value = "%s += 1" % (p[1]) elif p[2] == "--": value = "%s -= 1" % (p[1]) p[0] = Node("double", None, value)
def p_open_stmt(p): """open_stmt : OPEN LPAREN atom RPAREN | OPEN LPAREN atom COMMA STRING RPAREN""" mode = "\"r\"" # Default is read (r) (len == 5) if len(p) == 7: mode = p[5] line = "open(%%s, %s)" % mode p[0] = Node("open", [p[3]], None, line)
def p_atom(p): """atom : ID | NUMBER | BOOL | NULL | COORD | STRING""" p[0] = Node("atom", None, p[1])
def p_stmt(p): """stmt : io_stmt SEMI | assign_stmt SEMI | cond_stmt | exit_stmt SEMI | def_stmt | iter_stmt | jump_stmt SEMI | list_fn SEMI | except_stmt | double_stmt SEMI""" p[0] = Node("stmt", [p[1]])
def p_except_stmt(p): """except_stmt : try_simple | try_brace | except_brace | try_except_braces""" p[0] = Node("except", [p[1]])
def p_except_brace(p): """except_brace : TRY stmt EXCEPT ID LBRACE stmt_list RBRACE""" p[0] = Node("except_brace", [p[2], p[6]], p[4])
def p_try_except_braces(p): """try_except_braces : TRY LBRACE stmt_list RBRACE EXCEPT ID LBRACE stmt_list RBRACE""" p[0] = Node("try_except_braces", [p[3], p[8]], p[6])
def p_try_simple(p): """try_simple : TRY stmt EXCEPT ID stmt""" p[0] = Node("try_simple", [p[2], p[5]], p[4])
def p_try_brace(p): """try_brace : TRY LBRACE stmt_list RBRACE EXCEPT ID stmt""" p[0] = Node("try_brace", [p[3], p[7]], p[6])
def p_format_print_stmt(p): """format_print_stmt : PRINT LPAREN atom COMMA arglist RPAREN""" # Note: arglist defined in def_stmt.py p[0] = Node("print", [p[3], p[5]])
def p_def_stmt(p): """def_stmt : DEF def_fn LBRACE stmt_list RBRACE""" p[0] = Node("def", [p[2], p[4]])
def p_print_stmt(p): """print_stmt : simple_print_stmt | format_print_stmt""" p[0] = Node("print_stmt", [p[1]])
def p_num(p): """num : NUM LPAREN atom RPAREN""" p[0] = Node("num", [p[3]], None, "float(%s)")
def p_num_fn(p): """num_fn : num""" p[0] = Node("num_fn", [p[1]])