private static ASTNodeFilterExpr parseFilterExp(ASTNodeAbstractExpr node) { ASTNodeFilterExpr filt = new ASTNodeFilterExpr(); int i; for (i = node.content.Count - 1; i >= 0; i--) { if (node.content[i] is ASTNodePredicate) { filt.predicates.Insert(0, node.content[i]); } else { break; } } if (filt.predicates.Count == 0) { return(null); } filt.expr = node.extract(0, i + 1); return(filt); }
private static void parsePathExpr(ASTNode node) { if (node is ASTNodeAbstractExpr) { ASTNodeAbstractExpr absNode = (ASTNodeAbstractExpr)node; int[] pathOps = { Token.SLASH, Token.DBL_SLASH }; ASTNodeAbstractExpr.Partition part = absNode.partition(pathOps, 0, absNode.content.Count); if (part.separators.Count == 0) { //filter expression or standalone step if (isStep(absNode)) { ASTNodePathStep step = parseStep(absNode); ASTNodeLocPath path = new ASTNodeLocPath(); path.clauses.Add(step); absNode.condense(path, 0, absNode.content.Count); } else { //filter expr ASTNodeFilterExpr filt = parseFilterExp(absNode); if (filt != null) { absNode.condense(filt, 0, absNode.content.Count); } } } else { //path expression (but first clause may be filter expr) ASTNodeLocPath path = new ASTNodeLocPath(); path.separators = part.separators; if (part.separators.Count == 1 && absNode.content.Count == 1 && vectInt(part.separators, 0) == Token.SLASH) { //empty absolute path } else { for (int i = 0; i < part.pieces.Count; i++) { ASTNodeAbstractExpr x = (ASTNodeAbstractExpr)part.pieces[i]; if (isStep(x)) { ASTNodePathStep step = parseStep(x); path.clauses.Add(step); } else { if (i == 0) { if (x.content.Count == 0) { //absolute path expr; first clause is null /* do nothing */ } else { //filter expr ASTNodeFilterExpr filt = parseFilterExp(x); if (filt != null) { path.clauses.Add(filt); } else { path.clauses.Add(x); } } } else { throw new XPathSyntaxException(); } } } } absNode.condense(path, 0, absNode.content.Count); } } for (IEnumerator e = node.getChildren().GetEnumerator(); e.MoveNext();) { parsePathExpr((ASTNode)e.Current); } }