Example #1
0
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