code: def eval_string(self, s):
          
          # The parser is optimized to be fast when parsing Kconfig files (where
          # an expression can never appear at the beginning of a line). We have
          # to monkey-patch things a bit here to reuse it.
  
          self._filename = None
  
          # Don't include the "if " from below to avoid giving confusing error
          # messages
          self._line = s
          self._tokens = self._tokenize("if " + s)
          self._tokens_i = 1  # Skip the 'if' token
  
          return expr_value(self._expect_expr_and_eol())
docs: Returns the tristate value of the expression 's', represented as 0, 1,
          and 2 for n, m, and y, respectively. Raises KconfigError if syntax
          errors are detected in 's'. Warns if undefined symbols are referenced.
  
          As an example, if FOO and BAR are tristate symbols at least one of
          which has the value y, then config.eval_string("y && (FOO || BAR)")
          returns 2 (y).
  
          To get the string value of non-bool/tristate symbols, use
          Symbol.str_value. eval_string() always returns a tristate value, and
          all non-bool/tristate symbols have the tristate value 0 (n).
  
          The expression parsing is consistent with how parsing works for
          conditional ('if ...') expressions in the configuration, and matches
          the C implementation. m is rewritten to 'm && MODULES', so
          eval_string("m") will return 0 (n) unless modules are enabled.