def value(self, token, namespace_name=None): """ Given a single token, recursively evaluates and returns its value """ if namespace_name is None: namespace_name = self.current_namespace.name assert (isinstance(token, BaseType)) if isinstance(token, IfDefResult): for x in token.result: x.set_position(token.position) result = self.value(self.execute_token(x)) elif isinstance(token, DefineResult): token.result.set_position(token.position) result = self.value(self.execute_token(token.result)) elif isinstance(token, Statement): result = self.value(self.execute_token(token)) elif isinstance(token, Variable): scope = self.get_scope(token.name, namespace_name) if scope.level == 0 and not token.is_global: self.exception( SQFWarning( token.position, 'Local variable "%s" is not from this scope (not private)' % token)) try: result = scope[token.name] except KeyError: result = self.private_default_class() result.position = token.position key = '%s_%s_%s' % (namespace_name, scope.level, scope.normalize(token.name)) if key in self.variable_uses: self.variable_uses[key]['count'] += 1 elif isinstance(token, Array) and not token.is_undefined: result = Array( [self.value(self.execute_token(s)) for s in token.value]) result.position = token.position else: null_expressions = values_to_expressions([token], EXPRESSIONS_MAP, EXPRESSIONS) if null_expressions: result = null_expressions[0].execute([token], self) else: result = token result.position = token.position if isinstance( result, Code) and self.code_key(result) not in self._unexecuted_codes: self._unexecuted_codes[self.code_key(result)] = UnexecutedCode( result, self) return result
def execute_token(self, token): """ Given a single token, recursively evaluate it without returning its value (only type) """ # interpret the statement recursively if isinstance(token, Statement): result = self.execute_single(statement=token) # we do not want the position of the statement, but of the token, so we do not # store it here elif isinstance(token, Array) and token.value is not None: result = Array([self.execute_token(s) for s in token.value]) result.position = token.position else: result = token result.position = token.position return result
def execute_token(self, token): """ Given a single token, recursively evaluate it and return its value. """ # interpret the statement recursively if isinstance(token, Statement): result = self.execute_single(statement=token) elif isinstance(token, Array): # empty statements are ignored result = Array( [self.execute_token(s)[1] for s in token.value if s]) elif token == Keyword('isServer'): result = Boolean(self.client.is_server) elif token == Keyword('isDedicated'): result = Boolean(self.client.is_dedicated) else: result = token result.position = token.position return result, self.value(result)