func Expr(expr syntax.Expr, isPredeclared, isUniversal func(name string) bool) ([]*syntax.Ident, error) {
	r := newResolver(isPredeclared, isUniversal)
	r.expr(expr)
	r.env.resolveLocalUses()
	r.resolveNonLocalUses(r.env)  
	if len(r.errors) > 0 {
		return nil, r.errors
	}
	return r.moduleLocals, nil
}
Expr resolves the specified expression.
It returns the local variables bound within the expression.

The isPredeclared and isUniversal predicates behave as for the File function.
package resolve
import (
	"fmt"
	"log"
	"strings"
	"github.com/google/skylark/syntax"
)
const debug = false
const doesnt = "this Skylark dialect does not "
var (
	AllowNestedDef      = false  
	AllowLambda         = false  
	AllowFloat          = false  
	AllowSet            = false  
	AllowGlobalReassign = false  
	AllowBitwise        = false  
)
func File(file *syntax.File, isPredeclared, isUniversal func(name string) bool) error {
	r := newResolver(isPredeclared, isUniversal)
	r.stmts(file.Stmts)
	r.env.resolveLocalUses()
	r.resolveNonLocalUses(r.env)
	file.Locals = r.moduleLocals
	file.Globals = r.moduleGlobals
	if len(r.errors) > 0 {
		return r.errors
	}
	return nil
}