コード例 #1
0
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]])
コード例 #2
0
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()")
コード例 #3
0
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]])
コード例 #4
0
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)")
コード例 #5
0
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]])
コード例 #6
0
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]])
コード例 #7
0
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]])
コード例 #8
0
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")
コード例 #9
0
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])
コード例 #10
0
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]])
コード例 #11
0
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()")
コード例 #12
0
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)")
コード例 #13
0
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)
コード例 #14
0
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]])
コード例 #15
0
def p_str_fn(p):
    """str_fn : len
              | split
              | strip
              | str
              | join"""
    p[0] = Node("str_fn", [p[1]])
コード例 #16
0
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])
コード例 #17
0
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)
コード例 #18
0
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)
コード例 #19
0
def p_atom(p):
    """atom : ID
            | NUMBER
            | BOOL
            | NULL
            | COORD
            | STRING"""
    p[0] = Node("atom", None, p[1])
コード例 #20
0
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]])
コード例 #21
0
def p_except_stmt(p):
    """except_stmt : try_simple
                   | try_brace
                   | except_brace
                   | try_except_braces"""
    p[0] = Node("except", [p[1]])
コード例 #22
0
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])
コード例 #23
0
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])
コード例 #24
0
def p_try_simple(p):
    """try_simple : TRY stmt EXCEPT ID stmt"""
    p[0] = Node("try_simple", [p[2], p[5]], p[4])
コード例 #25
0
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])
コード例 #26
0
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]])
コード例 #27
0
def p_def_stmt(p):
    """def_stmt : DEF def_fn LBRACE stmt_list RBRACE"""
    p[0] = Node("def", [p[2], p[4]])
コード例 #28
0
def p_print_stmt(p):
    """print_stmt : simple_print_stmt
                  | format_print_stmt"""
    p[0] = Node("print_stmt", [p[1]])
コード例 #29
0
def p_num(p):
    """num : NUM LPAREN atom RPAREN"""
    p[0] = Node("num", [p[3]], None, "float(%s)")
コード例 #30
0
def p_num_fn(p):
    """num_fn : num"""
    p[0] = Node("num_fn", [p[1]])