code: def _sat_formula(lexer, varname, fmt, nvars):
      
      types = {IntegerToken, LPAREN} | _SAT_TOKS[fmt]
      tok = _expect_token(lexer, types)
      # INT
      if isinstance(tok, IntegerToken):
          index = tok.value
          if not 0 < index <= nvars:
              fstr = "formula literal {} outside valid range: (0, {}]"
              raise Error(fstr.format(index, nvars))
          return ('var', (varname, ), (index, ))
      # '-'
      elif isinstance(tok, OP_not):
          tok = _expect_token(lexer, {IntegerToken, LPAREN})
          # '-' INT
          if isinstance(tok, IntegerToken):
              index = tok.value
              if not 0 < index <= nvars:
                  fstr = "formula literal {} outside valid range: (0, {}]"
                  raise Error(fstr.format(index, nvars))
              return ('not', ('var', (varname, ), (index, )))
          # '-' '(' FORMULA ')'
          else:
              formula = _sat_formula(lexer, varname, fmt, nvars)
              _expect_token(lexer, {RPAREN})
              return ('not', formula)
      # '(' FORMULA ')'
      elif isinstance(tok, LPAREN):
          formula = _sat_formula(lexer, varname, fmt, nvars)
          _expect_token(lexer, {RPAREN})
          return formula
      # OP '(' FORMULAS ')'
      else:
          _expect_token(lexer, {LPAREN})
          formulas = _formulas(lexer, varname, fmt, nvars)
          _expect_token(lexer, {RPAREN})
          return (tok.ASTOP, ) + formulas
docs: Return a DIMACS SAT formula.