Пример #1
0
def p_Result(p):
    '''Result : Parameters
              | Type
    '''
    parsed.append(p.slice)
    if p[1].name == 'Type':
        p[0] = TreeNode('Result', 1, 'None', 0, [p[1]])
    else:
        p[0] = p[1]
        p[0].name = 'Result'
    return
Пример #2
0
def p_Parameters(p):
    '''Parameters : LROUND RROUND
                  | LROUND ParameterList RROUND
    '''
    parsed.append(p.slice)
    if len(p) == 3:
        p[0] = TreeNode('Parameters', 0, 'None')
    else:
        p[0] = p[2]
        p[0].name = 'Parameters'
    return
Пример #3
0
def p_PrintIntStmt(p):
    '''PrintIntStmt : PRINTLN LROUND IDENTIFIER RROUND
                    | PRINTLN LROUND int_lit RROUND
    '''
    if hasattr(p[3], 'name') and p[3].name == 'int_lit':
        p[0] = p[3]
        # p[0].isLvalue = 0
    else:
        p[0] = TreeNode('IDENTIFIER', p[3], 'INT', 1, [])
    p[0].TAC.add_line(['print_int', check_variable(p[0]), '', ''])
    p[0].name = 'PrintIntStmt'
    return
Пример #4
0
def p_Expression(p):
    '''Expression : UnaryExpr
                 | Expression OR_OR Expression
                 | Expression AMP_AMP Expression
                 | Expression EQ_EQ Expression
                 | Expression NOT_EQ Expression
                 | Expression LT Expression
                 | Expression LT_EQ Expression
                 | Expression GT Expression
                 | Expression GT_EQ Expression
                 | Expression PLUS Expression
                 | Expression MINUS Expression
                 | Expression OR Expression
                 | Expression CARET Expression
                 | Expression STAR Expression
                 | Expression DIVIDE Expression
                 | Expression MODULO Expression
                 | Expression LS Expression
                 | Expression RS Expression
                 | Expression AMP Expression
                 | Expression AND_OR Expression
    '''
    global current_scope
    if len(p) == 2:
        p[0] = p[1]
    elif len(p) == 4:
        expression = p[1].data + p[2] + p[3].data
        expr_node = SymbolTable.search_expr(expression)
        if not expr_node:
            temp = tempGen()
            node = symboltable_node()
            node.name = temp
            node.value = p[1].data + p[2] + p[3].data
            node.expr = p[1].data + p[2] + p[3].data
            node.type = p[1].input_type
            node.scope = current_scope
            SymbolTable.add_node(node)
            #print(f"Evaluating expression {node.value}")
            node.value = evalExpr(p[1], p[2], p[3])
            #SymbolTable.print_symbol_table()
            #print(node.value, node.name)
            p[0] = TreeNode('IDENTIFIER', temp, 'INT', 1, [], p[1].TAC)
            node.exprnode = p[0]
            p[0].TAC.append_TAC(p[3].TAC)
            p[0].TAC.add_line([p[2], p[0].data, p[1].data, p[3].data])
        else:
            p[0] = expr_node.exprnode
    p[0].name = 'Expression'
    return
Пример #5
0
def p_ReturnStmt(p):
    '''ReturnStmt : RETURN
                  | RETURN Expression
                  | RETURN ExpressionList
    '''
    parsed.append(p.slice)
    if len(p) == 2:
        p[0] = TreeNode('ReturnStmt', 0, 'None')
        p[0].TAC.add_line(['return', '', '', ''])
    if len(p) == 3:
        if p[2].name == 'Expression':
            p[0] = p[2]
            p[0].name = 'ReturnStmt'
            p[0].TAC.add_line(['return', check_variable(p[2]), '', ''])
    return
Пример #6
0
def p_UnaryExpr(p):
    '''UnaryExpr : PrimaryExpr
                 | unary_op UnaryExpr
    '''
    parsed.append(p.slice)
    if len(p) == 2:
        p[0] = p[1]
    elif len(p) == 3:
        p[0] = TreeNode('IDENTIFIER', gen('temp'), 'INT', 1)
        p[0].TAC.add_line([
            check_variable(p[1]),
            check_variable(p[0]),
            check_variable(p[2]), ''
        ])
    p[0].name = 'UnaryExpr'
    return
Пример #7
0
def p_PrimaryExpr(p):
    '''PrimaryExpr : Operand
                 | IDENTIFIER
                 | PrimaryExpr Selector
                 | PrimaryExpr Index
                 | PrimaryExpr Arguments
    '''
    if len(p) == 2:
        if p.slice[1].type == 'IDENTIFIER':
            p[0] = TreeNode('IDENTIFIER', p[1], 'INT', 1, [])
        elif p[1].name == 'Operand':
            p[0] = p[1]
    elif len(p) == 3:
        if p[2].name == 'Arguments':
            p[0] = p[1]
            p[0].TAC.add_line(['call', p[1].data, '', ''])
    p[0].name = 'PrimaryExpr'
    return
Пример #8
0
def p_UnaryExpr(p):
    '''UnaryExpr : PrimaryExpr
                 | unary_op UnaryExpr
    '''
    global current_scope
    if len(p) == 2:
        p[0] = p[1]
    elif len(p) == 3:
        temp = tempGen()
        node = symboltable_node()
        node.name = temp
        node.value = p[2].data
        node.scope = current_scope
        SymbolTable.add_node(node)
        p[0] = TreeNode('IDENTIFIER', temp, 'INT', 1)
        p[0].TAC.add_line([p[1].data, p[0].data, p[2].data])
    p[0].name = 'UnaryExpr'
    return
Пример #9
0
def p_PrimaryExpr(p):
    '''PrimaryExpr : Operand
                   | IDENTIFIER
                   | PrimaryExpr Selector
                   | PrimaryExpr Index
                   | PrimaryExpr Arguments
    '''
    parsed.append(p.slice)
    if len(p) == 2:
        if p.slice[1].type == 'IDENTIFIER':
            p[0] = TreeNode('IDENTIFIER', p[1], 'INT', 1)
        elif p[1].name == 'Operand':
            p[0] = p[1]
    elif len(p) == 3:
        if p[2].name == 'Index':
            p[0] = TreeNode('IDENTIFIER', p[1].data, 'INT', 1, p[2].data)
        elif p[2].name == 'Arguments':
            p[0] = TreeNode('IDENTIFIER', gen('temp'), 'INT', 1)
            p[0].TAC.append_TAC(p[1].TAC)
            p[0].TAC.append_TAC(p[2].TAC)

            # p[1].print_node()
            func = check_variable(p[1]).split("_")
            scope, funcName = "_".join(func[:2]), "_".join(func[2:])

            temp = 0
            for f in symbol_table.symbol_table[scope]['functions']:
                if f.name == funcName:
                    temp = len(f.parameters)

            # p[2].print_node()
            for child in p[2].children:
                p[0].TAC.add_line(['putparam', check_variable(child), '', ''])

            if temp != p[2].data:
                print_error('Function ' + funcName + ' requires ' + str(temp) +
                            ' parameters but ' + str(p[2].data) + ' supplied')
            p[0].TAC.add_line(
                ['call', check_variable(p[1]),
                 str(p[2].data), ''])
            p[0].TAC.add_line(['return_value', check_variable(p[0]), '', ''])
    p[0].name = 'PrimaryExpr'
    return
Пример #10
0
def p_Arguments(p):
    '''Arguments : LROUND RROUND
                 | LROUND ExpressionList RROUND
                 | LROUND Expression RROUND
                 | LROUND Type RROUND
                 | LROUND Type COMMA ExpressionList RROUND
                 | LROUND Type COMMA Expression RROUND
    '''
    # print p.slice
    parsed.append(p.slice)
    if len(p) == 3:
        p[0] = TreeNode('Arguments', 0, 'None')
    if len(p) == 4:
        if p[2].name == 'Expression':
            p[0] = TreeNode('Arguments', 1, 'None', 0, [p[2]], p[2].TAC)
        if p[2].name == 'ExpressionList':
            p[0] = p[2]
            p[0].name = 'Arguments'
            p[0].data = len(p[2].children)
    return
Пример #11
0
def p_Expression(p):
    '''Expression : UnaryExpr
                  | Expression OR_OR Expression
                  | Expression AMP_AMP Expression
                  | Expression EQ_EQ Expression
                  | Expression NOT_EQ Expression
                  | Expression LT Expression
                  | Expression LT_EQ Expression
                  | Expression GT Expression
                  | Expression GT_EQ Expression
                  | Expression PLUS Expression
                  | Expression MINUS Expression
                  | Expression OR Expression
                  | Expression CARET Expression
                  | Expression STAR Expression
                  | Expression DIVIDE Expression
                  | Expression MODULO Expression
                  | Expression LS Expression
                  | Expression RS Expression
                  | Expression AMP Expression
                  | Expression AND_OR Expression
    '''
    parsed.append(p.slice)
    if len(p) == 2:
        p[0] = p[1]
    elif len(p) == 4:
        p[0] = TreeNode('IDENTIFIER', gen('temp'), 'INT', 1, [], p[1].TAC)
        p[0].TAC.append_TAC(p[3].TAC)
        p[0].TAC.add_line([
            p[2],
            check_variable(p[0]),
            check_variable(p[1]),
            check_variable(p[3])
        ])
    p[0].name = 'Expression'
    return