예제 #1
0
def evaluate_expression(node):
    if node.get_name() == '(':
        length = len(node.get_child_nodes())
        left_expr = evaluate_expression(node.get_child_nodes()[0])
        if length == 3:
            child = node.get_child_nodes()[2]
            expr = Expression(child.get_name())
            expr.set_node_type(child.get_type())
            right_expr = evaluate_expression(child.get_child_nodes()[0])
            expr.set_left_expr(left_expr)
            expr.set_right_expr(right_expr)
            if (not left_expr.get_type_error()) and (
                    not right_expr.get_type_error()
            ) and left_expr.get_type() == right_expr.get_type():
                AST.dot.edge(expr.get_gv_name(), left_expr.get_gv_name())
                AST.dot.edge(expr.get_gv_name(), right_expr.get_gv_name())
                expr.set_type(left_expr.get_type())
            else:
                if (not left_expr.get_type_error()) and (
                        not right_expr.get_type_error()
                ) and left_expr.get_type() != right_expr.get_type():
                    AST.dot.edge(expr.get_gv_name(),
                                 left_expr.get_gv_name(),
                                 color='red')
                    AST.dot.edge(expr.get_gv_name(),
                                 right_expr.get_gv_name(),
                                 color='red')
                else:
                    if left_expr.get_type_error():
                        AST.dot.edge(expr.get_gv_name(),
                                     left_expr.get_gv_name(),
                                     color='red')
                    else:
                        AST.dot.edge(expr.get_gv_name(),
                                     left_expr.get_gv_name())
                    if right_expr.get_type_error():
                        AST.dot.edge(expr.get_gv_name(),
                                     right_expr.get_gv_name(),
                                     color='red')
                    else:
                        AST.dot.edge(expr.get_gv_name(),
                                     right_expr.get_gv_name())
                expr.set_type_error(True)
            return expr
        else:
            return left_expr
    else:
        left_expr = Expression(node.get_name())
        if node.get_type() == 'num':
            left_expr.set_type('int')
        elif node.get_type() == 'bool':
            left_expr.set_type('bool')
        else:
            left_expr.set_type(symbol_table.get(node.get_name()))
        left_expr.set_node_type(node.get_type())
        if len(node.get_child_nodes()) <= 0:
            return left_expr
        child = node.get_child_nodes()[0]
        expr = Expression(child.get_name())
        expr.set_node_type(child.get_type())
        expr.set_left_expr(left_expr)
        child2 = child.get_child_nodes()[0]
        if len(child2.get_child_nodes()) > 0:
            right_expr = evaluate_expression(child2)
        else:
            right_expr = Expression(child2.get_name())
            if child2.get_type() == 'num':
                right_expr.set_type('int')
            elif child2.get_type() == 'bool':
                right_expr.set_type('bool')
            else:
                right_expr.set_type(symbol_table.get(child2.get_name()))
            right_expr.set_node_type(child2.get_type())
        if (not right_expr.get_type_error()) and (left_expr.get_type()
                                                  == right_expr.get_type()):
            AST.dot.edge(expr.get_gv_name(), left_expr.get_gv_name())
            AST.dot.edge(expr.get_gv_name(), right_expr.get_gv_name())
            expr.set_type(left_expr.get_type())
        else:
            if (not right_expr.get_type_error()) and (left_expr.get_type() !=
                                                      right_expr.get_type()):
                AST.dot.edge(expr.get_gv_name(),
                             left_expr.get_gv_name(),
                             color='red')
                AST.dot.edge(expr.get_gv_name(),
                             right_expr.get_gv_name(),
                             color='red')
            else:
                if right_expr.get_type_error():
                    AST.dot.edge(expr.get_gv_name(),
                                 right_expr.get_gv_name(),
                                 color='red')
                    AST.dot.edge(expr.get_gv_name(), left_expr.get_gv_name())
            expr.set_type_error(True)
        expr.set_right_expr(right_expr)
        return expr
예제 #2
0
def evaluate_expression(node):
    if node.get_name() == '(':
        length = len(node.get_child_nodes())
        left_expr = evaluate_expression(node.get_child_nodes()[0])
        if length == 3:
            child = node.get_child_nodes()[2]
            expr = Expression(child.get_name())
            expr.set_node_type(child.get_type())
            right_expr = evaluate_expression(child.get_child_nodes()[0])
            expr.set_left_expr(left_expr)
            expr.set_right_expr(right_expr)
            if (not left_expr.get_type_error()) and (not right_expr.get_type_error()) and left_expr.get_type() == right_expr.get_type():
                AST.dot.edge(expr.get_gv_name(), left_expr.get_gv_name())
                AST.dot.edge(expr.get_gv_name(), right_expr.get_gv_name())
                expr.set_type(left_expr.get_type())
            else:
                if (not left_expr.get_type_error()) and (not right_expr.get_type_error()) and left_expr.get_type() != right_expr.get_type():
                    AST.dot.edge(expr.get_gv_name(), left_expr.get_gv_name(), color='red')
                    AST.dot.edge(expr.get_gv_name(), right_expr.get_gv_name(), color='red')
                else:
                    if left_expr.get_type_error():
                        AST.dot.edge(expr.get_gv_name(), left_expr.get_gv_name(), color='red')
                    else:
                        AST.dot.edge(expr.get_gv_name(), left_expr.get_gv_name())
                    if right_expr.get_type_error():
                        AST.dot.edge(expr.get_gv_name(), right_expr.get_gv_name(), color='red')
                    else:
                        AST.dot.edge(expr.get_gv_name(), right_expr.get_gv_name())
                expr.set_type_error(True)
            return expr
        else:
            return left_expr
    else:
        left_expr = Expression(node.get_name())
        if node.get_type() == 'num':
            left_expr.set_type('int')
        elif node.get_type() == 'bool':
            left_expr.set_type('bool')
        else:
            left_expr.set_type(symbol_table.get(node.get_name()))
        left_expr.set_node_type(node.get_type())
        if len(node.get_child_nodes()) <= 0:
            return left_expr;
        child = node.get_child_nodes()[0]
        expr = Expression(child.get_name())
        expr.set_node_type(child.get_type())
        expr.set_left_expr(left_expr)
        child2 = child.get_child_nodes()[0]
        if len(child2.get_child_nodes()) > 0:
            right_expr = evaluate_expression(child2)
        else:
            right_expr = Expression(child2.get_name())
            if child2.get_type() == 'num':
                right_expr.set_type('int')
            elif child2.get_type() == 'bool':
                right_expr.set_type('bool')
            else:
                right_expr.set_type(symbol_table.get(child2.get_name()))
            right_expr.set_node_type(child2.get_type())
        if (not right_expr.get_type_error()) and (left_expr.get_type() == right_expr.get_type()):
            AST.dot.edge(expr.get_gv_name(), left_expr.get_gv_name())
            AST.dot.edge(expr.get_gv_name(), right_expr.get_gv_name())
            expr.set_type(left_expr.get_type())
        else:
            if (not right_expr.get_type_error()) and (left_expr.get_type() != right_expr.get_type()):
                AST.dot.edge(expr.get_gv_name(), left_expr.get_gv_name(), color='red')
                AST.dot.edge(expr.get_gv_name(), right_expr.get_gv_name(), color='red')
            else:
                if right_expr.get_type_error():
                    AST.dot.edge(expr.get_gv_name(), right_expr.get_gv_name(), color='red')
                    AST.dot.edge(expr.get_gv_name(), left_expr.get_gv_name())
            expr.set_type_error(True)
        expr.set_right_expr(right_expr)
        return expr
예제 #3
0
def generate_statement_list(param_node):
    node = param_node
    stmt_list = StmtList()
    while True:
        if node.get_type() == 'ident':
            left_expr = Expression(node.get_name())
            left_expr.set_type(symbol_table.get(node.get_name()))
            left_expr.set_node_type(node.get_type())
            assign_stmt = AssignStatement(left_expr)
            assign_name = node.get_child_nodes()[0].get_name()
            assign_stmt.set_name(assign_name)
            right_expr = evaluate_expression(node.get_child_nodes()[1])
            assign_stmt.set_right_expr(right_expr)
            stmt_list.add_statement_to_list(assign_stmt)
            if (not right_expr.get_type_error()) and (
                    left_expr.get_type() == right_expr.get_type()):
                AST.dot.edge(stmt_list.get_gv_name(),
                             assign_stmt.get_gv_name())
                AST.dot.edge(assign_stmt.get_gv_name(),
                             left_expr.get_gv_name())
                AST.dot.edge(assign_stmt.get_gv_name(),
                             right_expr.get_gv_name())
                assign_stmt.set_type(left_expr.get_type())
            else:
                AST.dot.edge(stmt_list.get_gv_name(),
                             assign_stmt.get_gv_name(),
                             color='red')
                AST.dot.edge(assign_stmt.get_gv_name(),
                             left_expr.get_gv_name(),
                             color='red')
                AST.dot.edge(assign_stmt.get_gv_name(),
                             right_expr.get_gv_name(),
                             color='red')
                stmt_list.set_type_error(True)

        elif node.get_name() == 'while' or node.get_name() == 'if':
            child0 = node.get_child_nodes()[0]
            length = len(child0.get_child_nodes())
            if length > 1:
                left_expr = evaluate_expression(child0)
                child = child0.get_child_nodes()[1]
            else:
                left_expr = Expression(child0.get_name())
                left_expr.set_type(symbol_table.get(child0.get_name()))
                left_expr.set_node_type(child0.get_type())
                child = child0.get_child_nodes()[0]
            compare_expr = Expression(child.get_name())
            compare_expr.set_type('bool')
            right_expr = evaluate_expression(child.get_child_nodes()[0])
            if (not left_expr.get_type_error()) and (
                    not right_expr.get_type_error()) and (
                        left_expr.get_type() == right_expr.get_type()):
                AST.dot.edge(compare_expr.get_gv_name(),
                             left_expr.get_gv_name())
                AST.dot.edge(compare_expr.get_gv_name(),
                             right_expr.get_gv_name())
            else:
                if (not left_expr.get_type_error()) and (
                        not right_expr.get_type_error()) and (
                            left_expr.get_type() != right_expr.get_type()):
                    AST.dot.edge(compare_expr.get_gv_name(),
                                 left_expr.get_gv_name(),
                                 color='red')
                    AST.dot.edge(compare_expr.get_gv_name(),
                                 right_expr.get_gv_name(),
                                 color='red')
                else:
                    if left_expr.get_type_error():
                        AST.dot.edge(compare_expr.get_gv_name(),
                                     left_expr.get_gv_name(),
                                     color='red')
                    else:
                        AST.dot.edge(compare_expr.get_gv_name(),
                                     left_expr.get_gv_name())
                    if right_expr.get_type_error():
                        AST.dot.edge(compare_expr.get_gv_name(),
                                     right_expr.get_gv_name(),
                                     color='red')
                    else:
                        AST.dot.edge(compare_expr.get_gv_name(),
                                     right_expr.get_gv_name())
                compare_expr.set_type_error(True)
            compare_expr.set_left_expr(left_expr)
            compare_expr.set_right_expr(right_expr)

            if node.get_name() == 'while':
                while_statement = WhileStatement(compare_expr)
                while_statement.set_name(node.get_name())
                while_statement.set_node_type(node.get_type())
                st_lst = generate_statement_list(node.get_child_nodes()[2])
                while_statement.set_while_block_stmt_list(st_lst)
                stmt_list.add_statement_to_list(while_statement)
                if compare_expr.get_type_error() or st_lst.get_type_error():
                    AST.dot.edge(stmt_list.get_gv_name(),
                                 while_statement.get_gv_name(),
                                 color='red')
                    if compare_expr.get_type_error():
                        AST.dot.edge(while_statement.get_gv_name(),
                                     compare_expr.get_gv_name(),
                                     color='red')
                    else:
                        AST.dot.edge(while_statement.get_gv_name(),
                                     compare_expr.get_gv_name())
                    if st_lst.get_type_error():
                        AST.dot.edge(while_statement.get_gv_name(),
                                     st_lst.get_gv_name(),
                                     color='red')
                    else:
                        AST.dot.edge(while_statement.get_gv_name(),
                                     st_lst.get_gv_name())
                    stmt_list.set_type_error(True)
                else:
                    AST.dot.edge(stmt_list.get_gv_name(),
                                 while_statement.get_gv_name())
                    AST.dot.edge(while_statement.get_gv_name(),
                                 compare_expr.get_gv_name())
                    AST.dot.edge(while_statement.get_gv_name(),
                                 st_lst.get_gv_name())
            else:
                if_statement = IfStatement(compare_expr)
                if_statement.set_name(node.get_name())
                if_statement.set_node_type(node.get_type())
                then_block = node.get_child_nodes()[2]
                else_block = node.get_child_nodes()[3].get_child_nodes()[0]
                then_lst = generate_statement_list(then_block)
                else_lst = generate_statement_list(else_block)
                if_statement.set_if_block_stmt_list(then_lst)
                if_statement.set_else_block_stmt_list(else_lst)
                stmt_list.add_statement_to_list(if_statement)
                if compare_expr.get_type_error() or then_lst.get_type_error(
                ) or else_lst.get_type_error():
                    AST.dot.edge(stmt_list.get_gv_name(),
                                 if_statement.get_gv_name(),
                                 color='red')
                    if compare_expr.get_type_error():
                        AST.dot.edge(if_statement.get_gv_name(),
                                     compare_expr.get_gv_name(),
                                     color='red')
                    else:
                        AST.dot.edge(if_statement.get_gv_name(),
                                     compare_expr.get_gv_name())
                    if then_lst.get_type_error():
                        AST.dot.edge(if_statement.get_gv_name(),
                                     then_lst.get_gv_name(),
                                     color='red')
                    else:
                        AST.dot.edge(if_statement.get_gv_name(),
                                     then_lst.get_gv_name())
                    if else_lst.get_type_error():
                        AST.dot.edge(if_statement.get_gv_name(),
                                     else_lst.get_gv_name(),
                                     color='red')
                    else:
                        AST.dot.edge(if_statement.get_gv_name(),
                                     else_lst.get_gv_name())
                    stmt_list.set_type_error(True)
                else:
                    AST.dot.edge(stmt_list.get_gv_name(),
                                 if_statement.get_gv_name())
                    AST.dot.edge(if_statement.get_gv_name(),
                                 compare_expr.get_gv_name())
                    AST.dot.edge(if_statement.get_gv_name(),
                                 then_lst.get_gv_name())
                    AST.dot.edge(if_statement.get_gv_name(),
                                 else_lst.get_gv_name())

        elif node.get_name() == 'writeint':
            expr = evaluate_expression(node.get_child_nodes()[0])
            statement = Statement(expr)
            statement.set_name(node.get_name())
            stmt_list.add_statement_to_list(statement)
            if (not expr.get_type_error()) and (expr.get_type() == 'int'):
                AST.dot.edge(stmt_list.get_gv_name(), statement.get_gv_name())
                AST.dot.edge(statement.get_gv_name(), expr.get_gv_name())
            else:
                AST.dot.edge(stmt_list.get_gv_name(),
                             statement.get_gv_name(),
                             color='red')
                AST.dot.edge(statement.get_gv_name(),
                             expr.get_gv_name(),
                             color='red')
                stmt_list.set_type_error(True)
        else:
            break

        length = len(node.get_child_nodes())
        node = node.get_child_nodes()[length - 1]

    return stmt_list
예제 #4
0
def generate_statement_list(param_node):
    node = param_node
    stmt_list = StmtList()
    while True:
        if node.get_type() == 'ident':
            left_expr = Expression(node.get_name())
            left_expr.set_type(symbol_table.get(node.get_name()))
            left_expr.set_node_type(node.get_type())
            assign_stmt = AssignStatement(left_expr)
            assign_name = node.get_child_nodes()[0].get_name()
            assign_stmt.set_name(assign_name)
            right_expr = evaluate_expression(node.get_child_nodes()[1])
            assign_stmt.set_right_expr(right_expr)
            stmt_list.add_statement_to_list(assign_stmt)
            if (not right_expr.get_type_error()) and (left_expr.get_type() == right_expr.get_type()):
                AST.dot.edge(stmt_list.get_gv_name(), assign_stmt.get_gv_name())
                AST.dot.edge(assign_stmt.get_gv_name(), left_expr.get_gv_name())
                AST.dot.edge(assign_stmt.get_gv_name(), right_expr.get_gv_name())
                assign_stmt.set_type(left_expr.get_type())
            else:
                AST.dot.edge(stmt_list.get_gv_name(), assign_stmt.get_gv_name(), color='red')
                AST.dot.edge(assign_stmt.get_gv_name(), left_expr.get_gv_name(), color='red')
                AST.dot.edge(assign_stmt.get_gv_name(), right_expr.get_gv_name(), color='red')
                stmt_list.set_type_error(True)

        elif node.get_name() == 'while' or node.get_name() == 'if':
            child0 = node.get_child_nodes()[0]
            length = len(child0.get_child_nodes())
            if length > 1:
                left_expr = evaluate_expression(child0)
                child = child0.get_child_nodes()[1]
            else:
                left_expr = Expression(child0.get_name())
                left_expr.set_type(symbol_table.get(child0.get_name()))
                left_expr.set_node_type(child0.get_type())
                child = child0.get_child_nodes()[0]
            compare_expr = Expression(child.get_name())
            compare_expr.set_type('bool')
            right_expr = evaluate_expression(child.get_child_nodes()[0])
            if (not left_expr.get_type_error()) and (not right_expr.get_type_error()) and (left_expr.get_type() == right_expr.get_type()):
                AST.dot.edge(compare_expr.get_gv_name(), left_expr.get_gv_name())
                AST.dot.edge(compare_expr.get_gv_name(), right_expr.get_gv_name())
            else:
                if (not left_expr.get_type_error()) and (not right_expr.get_type_error()) and (left_expr.get_type() != right_expr.get_type()):
                    AST.dot.edge(compare_expr.get_gv_name(), left_expr.get_gv_name(), color='red')
                    AST.dot.edge(compare_expr.get_gv_name(), right_expr.get_gv_name(), color='red')
                else:
                    if left_expr.get_type_error():
                        AST.dot.edge(compare_expr.get_gv_name(), left_expr.get_gv_name(), color='red')
                    else:
                        AST.dot.edge(compare_expr.get_gv_name(), left_expr.get_gv_name())
                    if right_expr.get_type_error():
                        AST.dot.edge(compare_expr.get_gv_name(), right_expr.get_gv_name(), color='red')
                    else:
                        AST.dot.edge(compare_expr.get_gv_name(), right_expr.get_gv_name())
                compare_expr.set_type_error(True)
            compare_expr.set_left_expr(left_expr)
            compare_expr.set_right_expr(right_expr)

            if node.get_name() == 'while':
                while_statement = WhileStatement(compare_expr)
                while_statement.set_name(node.get_name())
                while_statement.set_node_type(node.get_type())
                st_lst = generate_statement_list(node.get_child_nodes()[2])
                while_statement.set_while_block_stmt_list(st_lst)
                stmt_list.add_statement_to_list(while_statement)
                if compare_expr.get_type_error() or st_lst.get_type_error():
                    AST.dot.edge(stmt_list.get_gv_name(), while_statement.get_gv_name(), color='red')
                    if compare_expr.get_type_error():
                        AST.dot.edge(while_statement.get_gv_name(), compare_expr.get_gv_name(), color='red')
                    else:
                        AST.dot.edge(while_statement.get_gv_name(), compare_expr.get_gv_name())
                    if st_lst.get_type_error():
                        AST.dot.edge(while_statement.get_gv_name(), st_lst.get_gv_name(), color='red')
                    else:
                        AST.dot.edge(while_statement.get_gv_name(), st_lst.get_gv_name())
                    stmt_list.set_type_error(True)
                else:
                    AST.dot.edge(stmt_list.get_gv_name(), while_statement.get_gv_name())
                    AST.dot.edge(while_statement.get_gv_name(), compare_expr.get_gv_name())
                    AST.dot.edge(while_statement.get_gv_name(), st_lst.get_gv_name())
            else:
                if_statement = IfStatement(compare_expr)
                if_statement.set_name(node.get_name())
                if_statement.set_node_type(node.get_type())
                then_block = node.get_child_nodes()[2]
                else_block = node.get_child_nodes()[3].get_child_nodes()[0]
                then_lst = generate_statement_list(then_block)
                else_lst = generate_statement_list(else_block)
                if_statement.set_if_block_stmt_list(then_lst)
                if_statement.set_else_block_stmt_list(else_lst)
                stmt_list.add_statement_to_list(if_statement)
                if compare_expr.get_type_error() or then_lst.get_type_error() or else_lst.get_type_error():
                    AST.dot.edge(stmt_list.get_gv_name(), if_statement.get_gv_name(), color='red')
                    if compare_expr.get_type_error():
                        AST.dot.edge(if_statement.get_gv_name(), compare_expr.get_gv_name(), color='red')
                    else:
                        AST.dot.edge(if_statement.get_gv_name(), compare_expr.get_gv_name())
                    if then_lst.get_type_error():
                        AST.dot.edge(if_statement.get_gv_name(), then_lst.get_gv_name(), color='red')
                    else:
                        AST.dot.edge(if_statement.get_gv_name(), then_lst.get_gv_name())
                    if else_lst.get_type_error():
                        AST.dot.edge(if_statement.get_gv_name(), else_lst.get_gv_name(), color='red')
                    else:
                        AST.dot.edge(if_statement.get_gv_name(), else_lst.get_gv_name())
                    stmt_list.set_type_error(True)
                else:
                    AST.dot.edge(stmt_list.get_gv_name(), if_statement.get_gv_name())
                    AST.dot.edge(if_statement.get_gv_name(), compare_expr.get_gv_name())
                    AST.dot.edge(if_statement.get_gv_name(), then_lst.get_gv_name())
                    AST.dot.edge(if_statement.get_gv_name(), else_lst.get_gv_name())

        elif node.get_name() == 'writeint':
            expr = evaluate_expression(node.get_child_nodes()[0])
            statement = Statement(expr)
            statement.set_name(node.get_name())
            stmt_list.add_statement_to_list(statement)
            if (not expr.get_type_error()) and (expr.get_type() == 'int'):
                AST.dot.edge(stmt_list.get_gv_name(), statement.get_gv_name())
                AST.dot.edge(statement.get_gv_name(), expr.get_gv_name())
            else:
                AST.dot.edge(stmt_list.get_gv_name(), statement.get_gv_name(), color='red')
                AST.dot.edge(statement.get_gv_name(), expr.get_gv_name(), color='red')
                stmt_list.set_type_error(True)
        else:
            break;

        length = len(node.get_child_nodes())
        node = node.get_child_nodes()[length - 1]

    return stmt_list