LOG.debug("eval: " + expr);
	public Sequence eval(		DocumentSet docs,		Sequence contextSequence,		Item contextItem)		throws XPathException {		String expr = StringValue.expand(			getArgument(0).eval(docs, contextSequence, contextItem).getStringValue()		);		XPathLexer2 lexer = new XPathLexer2(new StringReader(expr));		XPathParser2 parser = new XPathParser2(lexer, false);		// shares the context of the outer expression		XPathTreeParser2 astParser = new XPathTreeParser2(context);		try {			parser.xpath();			if(parser.foundErrors()) {				LOG.debug(parser.getErrorMessage());				throw new XPathException("error found while executing expression: " +					parser.getErrorMessage());			}			AST ast = parser.getAST();			LOG.debug("generated AST: " + ast.toStringList());						PathExpr path = new PathExpr(context);			astParser.xpath(ast, path);			if(astParser.foundErrors()) {				throw new XPathException("error found while executing expression: " +					astParser.getErrorMessage(), astParser.getLastException());			}			Sequence sequence = path.eval(docs, null, null);			LOG.debug("found " + sequence.getLength());			return sequence;		} catch (RecognitionException e) {			throw new XPathException("error found while executing expression: " +				e.getMessage(), e);		} catch (TokenStreamException e) {			throw new XPathException("error found while executing expression: " +				e.getMessage(), e);		} catch (XPathException e) {			throw new XPathException("error found while executing expression: " +				e.getMessage(), e);		}	}