parameters: (expr_text, valid_variables)
return_statement: return p.parse()
docstring: parses the simple criteria expression syntax used in
      dependency specifications.
      Returns an ExprNode instance that can be evaluated like this:
  
      ```
      expr = parse_expr("os=windows")
      ok = expr.eval({
          "os": "windows"
      })
      ```
  
      Whitespace is allowed between tokens.  The following terms
      are recognized:
  
      KEY = VALUE   # Evaluates to True if ctx[KEY] == VALUE
      not(EXPR)     # Evaluates to True if EXPR evaluates to False
                    # and vice versa
      all(EXPR1, EXPR2, ...) # Evaluates True if all of the supplied
                             # EXPR's also evaluate True
      any(EXPR1, EXPR2, ...) # Evaluates True if any of the supplied
                             # EXPR's also evaluate True, False if
                             # none of them evaluated true.
docstring_summary: parses the simple criteria expression syntax used in
      dependency specifications.
      Returns an ExprNode instance that can be evaluated like this:
docstring_tokens: parses the simple criteria expression syntax used in dependency specifications . Returns an ExprNode instance that can be evaluated like this :
function: def parse_expr(expr_text, valid_variables):
      """parses the simple criteria expression syntax used in
      dependency specifications.
      Returns an ExprNode instance that can be evaluated like this:
  
      ```
      expr = parse_expr("os=windows")
      ok = expr.eval({
          "os": "windows"
      })
      ```
  
      Whitespace is allowed between tokens.  The following terms
      are recognized:
  
      KEY = VALUE   # Evaluates to True if ctx[KEY] == VALUE
      not(EXPR)     # Evaluates to True if EXPR evaluates to False
                    # and vice versa
      all(EXPR1, EXPR2, ...) # Evaluates True if all of the supplied
                             # EXPR's also evaluate True
      any(EXPR1, EXPR2, ...) # Evaluates True if any of the supplied
                             # EXPR's also evaluate True, False if
                             # none of them evaluated true.
      """
  
      p = Parser(expr_text, valid_variables)
      return p.parse()
function_tokens: def parse_expr ( expr_text , valid_variables ) : p = Parser ( expr_text , valid_variables ) return p . parse ( )