/** Called to push a new lexical scope onto the stack. */ private boolean lexicalClimb(PageCompilingContext pc, Node node) { if (node.attr(ANNOTATION).length() > 1) { // Setup a new lexical scope (symbol table changes on each scope encountered). if (REPEAT_WIDGET.equalsIgnoreCase(node.attr(ANNOTATION_KEY)) || CHOOSE_WIDGET.equalsIgnoreCase(node.attr(ANNOTATION_KEY))) { String[] keyAndContent = {node.attr(ANNOTATION_KEY), node.attr(ANNOTATION_CONTENT)}; pc.lexicalScopes.push(new MvelEvaluatorCompiler(parseRepeatScope(pc, keyAndContent, node))); return true; } // Setup a new lexical scope for compiling against embedded pages (closures). final PageBook.Page embed = pageBook.forName(node.attr(ANNOTATION_KEY)); if (null != embed) { final Class<?> embedClass = embed.pageClass(); MvelEvaluatorCompiler compiler = new MvelEvaluatorCompiler(embedClass); checkEmbedAgainst( pc, compiler, Parsing.toBindMap(node.attr(ANNOTATION_CONTENT)), embedClass, node); pc.lexicalScopes.push(compiler); return true; } } return false; }