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
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
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
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