def assign(self, interpreter_flag=False): Interpreter.interpreter_flag = interpreter_flag sc = self.scanner lexeme_identifier = sc.next_lexeme() if Interpreter.interpreter_flag: # semantic if not self.semantic_tree.is_describe_var_early(sc.get_pointer_line(), sc.get_pointer_position(), sc.lexeme): raise SemanticExceptionUndescribeVar(sc.get_pointer_line(), sc.get_pointer_position(), sc.lexeme) # semantic if Interpreter.interpreter_flag: # Interpreter node = self.semantic_tree.get_variable_node(sc.lexeme) # Interpreter sc.next_lexeme() # = value_obj = ValueObj() self.expression(value_obj, interpreter_flag=Interpreter.interpreter_flag) if Interpreter.interpreter_flag: # Interpreter Interpreter.to_type(value_obj, node.type_data) node.value = value_obj.value
def enum_operand(self, interpreter_flag=False): Interpreter.interpreter_flag = interpreter_flag sc = self.scanner old_pointer = sc.get_pointer() lexeme = sc.next_lexeme() if lexeme != lId.TClose: sc.set_pointer(old_pointer) value_obj = ValueObj() self.expression(value_obj, interpreter_flag=Interpreter.interpreter_flag) if Interpreter.interpreter_flag: # semantic self.semantic_tree.current_count_parameter += 1 self.semantic_tree.go_left() if self.semantic_tree.pointer != self.semantic_tree.dummy: Interpreter.to_type(value_obj, self.semantic_tree.pointer.type_data) self.semantic_tree.pointer.value = value_obj.value # semantic old_pointer = sc.get_pointer() lexeme = sc.next_lexeme() while lexeme == lId.TComma: value_obj = ValueObj() self.expression(value_obj, interpreter_flag=Interpreter.interpreter_flag) if Interpreter.interpreter_flag: # semantic self.semantic_tree.current_count_parameter += 1 self.semantic_tree.go_left() if self.semantic_tree.pointer != self.semantic_tree.dummy: Interpreter.to_type(value_obj, self.semantic_tree.pointer.type_data) self.semantic_tree.pointer.value = value_obj.value # semantic old_pointer = sc.get_pointer() lexeme = sc.next_lexeme() sc.set_pointer(old_pointer)
def set_value_obj(self, value_obj): Interpreter.to_type(value_obj, self.pointer.type_data) self.pointer.value = value_obj.value
def operator(self, interpreter_flag=False): Interpreter.interpreter_flag = interpreter_flag sc = self.scanner old_pointer = sc.get_pointer() lexeme = sc.next_lexeme() if lexeme == lId.TOpenFigure: sc.set_pointer(old_pointer) self.body_function(interpreter_flag=Interpreter.interpreter_flag) elif lexeme == lId.TSemicolon: ... elif lexeme == lId.TDo: self.operator(interpreter_flag=Interpreter.interpreter_flag) lexeme_while = sc.next_lexeme() if lexeme_while != lId.TWhile: raise SyntaxExceptionWhile(sc.get_pointer_line(), sc.get_pointer_position(), sc.lexeme) lexeme_open_bracket = sc.next_lexeme() if lexeme_open_bracket != lId.TOpen: raise SyntaxExceptionCharacter(sc.get_pointer_line(), sc.get_pointer_position(), "(", sc.lexeme) value_obj = ValueObj() self.expression(value_obj, interpreter_flag=Interpreter.interpreter_flag) if Interpreter.interpreter_flag: # Interpreter if value_obj.value != 0: sc.set_pointer(old_pointer) return # Interpreter lexeme_close_bracket = sc.next_lexeme() if lexeme_close_bracket != lId.TClose: raise SyntaxExceptionCharacter(sc.get_pointer_line(), sc.get_pointer_position(), ")", sc.lexeme) lexeme_semicolon = sc.next_lexeme() if lexeme_semicolon != lId.TSemicolon: raise SyntaxExceptionCharacter(sc.get_pointer_line(), sc.get_pointer_position(), ";", sc.lexeme) elif lexeme == lId.TReturn: value_obj = ValueObj() self.expression(value_obj, interpreter_flag=Interpreter.interpreter_flag) lexeme_semicolon = sc.next_lexeme() if lexeme_semicolon != lId.TSemicolon: raise SyntaxExceptionCharacter(sc.get_pointer_line(), sc.get_pointer_position(), ";", sc.lexeme) if Interpreter.interpreter_flag: # Interpreter parent_fun = self.semantic_tree.get_node_of_parent_function() Interpreter.to_type(value_obj, parent_fun.type_data) if parent_fun.lexeme != 'main': parent_fun.get_left().value = value_obj.value else: parent_fun.value = value_obj.value Interpreter.interpreter_flag = False # Interpreter else: sc.set_pointer(old_pointer) lexeme_identifier = sc.next_lexeme() if lexeme_identifier == lId.TId and sc.next_lexeme() == lId.TAssign: sc.set_pointer(old_pointer) self.assign(interpreter_flag=Interpreter.interpreter_flag) else: sc.set_pointer(old_pointer) value_obj = ValueObj() self.expression(value_obj, interpreter_flag=Interpreter.interpreter_flag) lexeme_semicolon = sc.next_lexeme() if lexeme_semicolon != lId.TSemicolon: raise SyntaxExceptionCharacter(sc.get_pointer_line(), sc.get_pointer_position(), ";", sc.lexeme)