def parse(): ice9_parser_global.logger.debug("Entering parse") in_head = False in_body = False # Case for no input if not ice9_parser_global.tok: return type = ice9_parser_global.tok.type stmt_node_list = list() ice9_parser_global.setup_code_generation() while type != 'EOF': in_head = False if in_body == False: if type == 'VAR': in_head = True ice9_parser_global.consume() ice9_parser_global.logger.debug(ice9_parser_global.tok) ice9_parser_var.handle_var() elif type == 'TYPE': in_head = True ice9_parser_global.consume() ice9_parser_global.logger.debug(ice9_parser_global.tok) ice9_parser_type.handle_type() elif type == 'FORWARD': in_head = True ice9_parser_global.consume() ice9_parser_global.logger.debug(ice9_parser_global.tok) ice9_parser_forward.handle_forward() elif type =='PROC': in_head = True ice9_parser_global.consume() ice9_parser_global.logger.debug(ice9_parser_global.tok) ice9_parser_proc.handle_proc() if in_head == False: ice9_parser_global.setup_stmt_section(ice9_parser_global.lno) if ice9_parser_statements.in_first_of_statement() == True: in_body = True stmt_node_list += ice9_parser_statements.statements() else: print "Line", ice9_parser_global.tok.lineno, ": unexpected token -", ice9_parser_global.tok.value sys.exit() type = ice9_parser_global.tok.type # Generate Code for stmt in stmt_node_list: stmt.generate_code() ice9_parser_global.logger.debug("Exiting parse") return
def handle_if(): ice9_parser_global.logger.debug("Entering handle_if") stmt_node = ice9_node.stmt_node() stmt_node.rule = 'IF' # The condition expression expr_node = ice9_parser_expressions.expr(None) if expr_node.return_data_type != 'bool': print "Line", ice9_parser_global.tok.lineno, ": on token", ice9_parser_global.tok.value, \ "if condition must return a 'bool'" sys.exit() if expr_node.dimension != 0: print "Line", ice9_parser_global.tok.lineno, ": on token", ice9_parser_global.tok.value, \ "if condition cannot be a array variable, must return a 'bool'" sys.exit() stmt_node.condition = expr_node if ice9_parser_global.tok.type == 'ARROW': ice9_parser_global.consume() ice9_parser_global.logger.debug(ice9_parser_global.tok) else: print "Line", ice9_parser_global.tok.lineno, ": on token", ice9_parser_global.tok.value, "expecting '->'" sys.exit() if ice9_parser_statements.in_first_of_statement(): stmt_node.pre_child = ice9_parser_statements.statements() else: print "Line", ice9_parser_global.tok.lineno, ": on token", ice9_parser_global.tok.value, "expecting a statement" sys.exit() if ice9_parser_global.tok.type == 'BOX': ice9_parser_global.consume() ice9_parser_global.logger.debug(ice9_parser_global.tok) stmt_node.post_child = elseif_or_else() if ice9_parser_global.tok.type == 'FI': ice9_parser_global.consume() ice9_parser_global.logger.debug(ice9_parser_global.tok) else: print "Line", ice9_parser_global.tok.lineno, ": on token", ice9_parser_global.tok.value, "expecting fi" sys.exit() ice9_parser_global.logger.debug("Exiting handle_if") return stmt_node
def elseif_or_else(): ice9_parser_global.logger.debug("Entering elseif_or_else") stmt_node = ice9_node.stmt_node() stmt_node.rule = 'IF' if ice9_parser_global.tok.type == 'ELSE': ice9_parser_global.consume() ice9_parser_global.logger.debug(ice9_parser_global.tok) # Create dummy expression that always evaluates to true expr_node = ice9_node.expr_node() expr_node.operation = 'TRUE' expr_node.return_data_type = 'bool' stmt_node.condition = expr_node if ice9_parser_global.tok.type == 'ARROW': ice9_parser_global.consume() ice9_parser_global.logger.debug(ice9_parser_global.tok) else: print "Line", ice9_parser_global.tok.lineno, ": on token", ice9_parser_global.tok.value, "expecting '->'" sys.exit() if ice9_parser_statements.in_first_of_statement(): stmt_node.pre_child = ice9_parser_statements.statements() else: print "Line", ice9_parser_global.tok.lineno, ": on token", ice9_parser_global.tok.value, "expecting a statement" sys.exit() else: # Condition expression expr_node = ice9_parser_expressions.expr(None) if expr_node.return_data_type != 'bool': print "Line", ice9_parser_global.tok.lineno, ": on token", ice9_parser_global.tok.value, \ "if condition must return a 'bool'" sys.exit() if expr_node.dimension != 0: print "Line", ice9_parser_global.tok.lineno, ": on token", ice9_parser_global.tok.value, \ "if condition cannot be a array variable, must return a 'bool'" sys.exit() stmt_node.condition = expr_node if ice9_parser_global.tok.type == 'ARROW': ice9_parser_global.consume() ice9_parser_global.logger.debug(ice9_parser_global.tok) else: print "Line", ice9_parser_global.tok.lineno, ": on token", ice9_parser_global.tok.value, "expecting ';'" sys.exit() if ice9_parser_statements.in_first_of_statement(): stmt_node.pre_child = ice9_parser_statements.statements() else: print "Line", ice9_parser_global.tok.lineno, ": on token", ice9_parser_global.tok.value, "expecting a statement" sys.exit() if ice9_parser_global.tok.type == 'BOX': ice9_parser_global.consume() ice9_parser_global.logger.debug(ice9_parser_global.tok) stmt_node.post_child = elseif_or_else() ice9_parser_global.logger.debug("Exiting elseif_or_else") return stmt_node