Пример #1
0
        private static void  parseBinaryOp(ASTNode node, int[] ops, int associativity)
        {
            if (node is ASTNodeAbstractExpr)
            {
                ASTNodeAbstractExpr           absNode = (ASTNodeAbstractExpr)node;
                ASTNodeAbstractExpr.Partition part    = absNode.partition(ops, 0, absNode.content.Count);

                if (part.separators.Count == 0)
                {
                    //no occurrences of op
                }
                else
                {
                    ASTNodeBinaryOp binOp = new ASTNodeBinaryOp();
                    binOp.associativity = associativity;
                    binOp.exprs         = part.pieces;
                    binOp.ops           = part.separators;

                    absNode.condense(binOp, 0, absNode.content.Count);
                }
            }

            //UPGRADE_TODO: Method 'java.util.Enumeration.hasMoreElements' was converted to 'System.Collections.IEnumerator.MoveNext' which has a different behavior. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1073_javautilEnumerationhasMoreElements'"
            for (System.Collections.IEnumerator e = node.Children.GetEnumerator(); e.MoveNext();)
            {
                //UPGRADE_TODO: Method 'java.util.Enumeration.nextElement' was converted to 'System.Collections.IEnumerator.Current' which has a different behavior. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1073_javautilEnumerationnextElement'"
                parseBinaryOp((ASTNode)e.Current, ops, associativity);
            }
        }
Пример #2
0
        private static void  parseBalanced(ASTNode node, SubNodeFactory snf, int lToken, int rToken)
        {
            if (node is ASTNodeAbstractExpr)
            {
                ASTNodeAbstractExpr absNode = (ASTNodeAbstractExpr)node;

                int i = 0;
                while (i < absNode.content.Count)
                {
                    int type = absNode.getTokenType(i);
                    if (type == rToken)
                    {
                        throw new XPathSyntaxException("Unbalanced brackets or parentheses!");                         //unbalanced
                    }
                    else if (type == lToken)
                    {
                        int j = absNode.indexOfBalanced(i, rToken, lToken, rToken);
                        if (j == -1)
                        {
                            throw new XPathSyntaxException("mismatched brackets or parentheses!");                             //mismatched
                        }

                        absNode.condense(snf.newNode(absNode.extract(i + 1, j)), i, j + 1);
                    }
                    i++;
                }
            }

            //UPGRADE_TODO: Method 'java.util.Enumeration.hasMoreElements' was converted to 'System.Collections.IEnumerator.MoveNext' which has a different behavior. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1073_javautilEnumerationhasMoreElements'"
            for (System.Collections.IEnumerator e = node.Children.GetEnumerator(); e.MoveNext();)
            {
                //UPGRADE_TODO: Method 'java.util.Enumeration.nextElement' was converted to 'System.Collections.IEnumerator.Current' which has a different behavior. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1073_javautilEnumerationnextElement'"
                parseBalanced((ASTNode)e.Current, snf, lToken, rToken);
            }
        }
Пример #3
0
        private static void  parseOperators(ASTNode root)
        {
            int[] orOp    = new int[] { Token.OR };
            int[] andOp   = new int[] { Token.AND };
            int[] eqOps   = new int[] { Token.EQ, Token.NEQ };
            int[] cmpOps  = new int[] { Token.LT, Token.LTE, Token.GT, Token.GTE };
            int[] addOps  = new int[] { Token.PLUS, Token.MINUS };
            int[] multOps = new int[] { Token.MULT, Token.DIV, Token.MOD };
            int[] unionOp = new int[] { Token.UNION };

            parseBinaryOp(root, orOp, ASTNodeBinaryOp.ASSOC_RIGHT);
            parseBinaryOp(root, andOp, ASTNodeBinaryOp.ASSOC_RIGHT);
            parseBinaryOp(root, eqOps, ASTNodeBinaryOp.ASSOC_LEFT);
            parseBinaryOp(root, cmpOps, ASTNodeBinaryOp.ASSOC_LEFT);
            parseBinaryOp(root, addOps, ASTNodeBinaryOp.ASSOC_LEFT);
            parseBinaryOp(root, multOps, ASTNodeBinaryOp.ASSOC_LEFT);
            parseUnaryOp(root, Token.UMINUS);
            parseBinaryOp(root, unionOp, ASTNodeBinaryOp.ASSOC_LEFT);             /* 'a|-b' parses weird (as in, doesn't), but i think that's correct */
        }
Пример #4
0
        public static void  verifyBaseExpr(ASTNode node)
        {
            if (node is ASTNodeAbstractExpr)
            {
                ASTNodeAbstractExpr absNode = (ASTNodeAbstractExpr)node;

                if (!absNode.Normalized)
                {
                    //UPGRADE_TODO: The equivalent in .NET for method 'java.lang.Object.toString' may return a different value. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1043'"
                    throw new XPathSyntaxException("Bad node: " + absNode.ToString());
                }
            }

            //UPGRADE_TODO: Method 'java.util.Enumeration.hasMoreElements' was converted to 'System.Collections.IEnumerator.MoveNext' which has a different behavior. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1073_javautilEnumerationhasMoreElements'"
            for (System.Collections.IEnumerator e = node.Children.GetEnumerator(); e.MoveNext();)
            {
                //UPGRADE_TODO: Method 'java.util.Enumeration.nextElement' was converted to 'System.Collections.IEnumerator.Current' which has a different behavior. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1073_javautilEnumerationnextElement'"
                verifyBaseExpr((ASTNode)e.Current);
            }
        }
Пример #5
0
        private static void  parseUnaryOp(ASTNode node, int op)
        {
            if (node is ASTNodeAbstractExpr)
            {
                ASTNodeAbstractExpr absNode = (ASTNodeAbstractExpr)node;

                if (absNode.content.Count > 0 && absNode.getTokenType(0) == op)
                {
                    ASTNodeUnaryOp unOp = new ASTNodeUnaryOp();
                    unOp.op   = op;
                    unOp.expr = (absNode.content.Count > 1?absNode.extract(1, absNode.content.Count):new ASTNodeAbstractExpr());
                    absNode.condense(unOp, 0, absNode.content.Count);
                }
            }

            //UPGRADE_TODO: Method 'java.util.Enumeration.hasMoreElements' was converted to 'System.Collections.IEnumerator.MoveNext' which has a different behavior. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1073_javautilEnumerationhasMoreElements'"
            for (System.Collections.IEnumerator e = node.Children.GetEnumerator(); e.MoveNext();)
            {
                //UPGRADE_TODO: Method 'java.util.Enumeration.nextElement' was converted to 'System.Collections.IEnumerator.Current' which has a different behavior. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1073_javautilEnumerationnextElement'"
                parseUnaryOp((ASTNode)e.Current, op);
            }
        }
Пример #6
0
        //find and condense all function calls in the current level, then do the same in lower levels
        private static void  parseFuncCalls(ASTNode node)
        {
            if (node is ASTNodeAbstractExpr)
            {
                ASTNodeAbstractExpr absNode = (ASTNodeAbstractExpr)node;

                int i = 0;
                while (i < absNode.content.Count - 1)
                {
                    if (absNode.getTokenType(i + 1) == Token.LPAREN && absNode.getTokenType(i) == Token.QNAME)
                    {
                        condenseFuncCall(absNode, i);
                    }
                    i++;
                }
            }

            //UPGRADE_TODO: Method 'java.util.Enumeration.hasMoreElements' was converted to 'System.Collections.IEnumerator.MoveNext' which has a different behavior. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1073_javautilEnumerationhasMoreElements'"
            for (System.Collections.IEnumerator e = node.Children.GetEnumerator(); e.MoveNext();)
            {
                //UPGRADE_TODO: Method 'java.util.Enumeration.nextElement' was converted to 'System.Collections.IEnumerator.Current' which has a different behavior. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1073_javautilEnumerationnextElement'"
                parseFuncCalls((ASTNode)e.Current);
            }
        }
Пример #7
0
        public static XPathExpression parse(System.Collections.ArrayList tokens)
        {
            ASTNode tree = buildParseTree(tokens);

            return(tree.build());
        }
Пример #8
0
        private static void  parsePathExpr(ASTNode node)
        {
            if (node is ASTNodeAbstractExpr)
            {
                ASTNodeAbstractExpr absNode = (ASTNodeAbstractExpr)node;
                int[] pathOps = new int[] { 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("Unexpected beginning of path");
                                }
                            }
                        }
                    }
                    absNode.condense(path, 0, absNode.content.Count);
                }
            }

            //UPGRADE_TODO: Method 'java.util.Enumeration.hasMoreElements' was converted to 'System.Collections.IEnumerator.MoveNext' which has a different behavior. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1073_javautilEnumerationhasMoreElements'"
            for (System.Collections.IEnumerator e = node.Children.GetEnumerator(); e.MoveNext();)
            {
                //UPGRADE_TODO: Method 'java.util.Enumeration.nextElement' was converted to 'System.Collections.IEnumerator.Current' which has a different behavior. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1073_javautilEnumerationnextElement'"
                parsePathExpr((ASTNode)e.Current);
            }
        }
Пример #9
0
 private static void  parsePredicates(ASTNode node)
 {
     parseBalanced(node, new AnonymousClassSubNodeFactory1(), Token.LBRACK, Token.RBRACK);
 }
Пример #10
0
 private static void  parseParens(ASTNode node)
 {
     parseBalanced(node, new AnonymousClassSubNodeFactory(), Token.LPAREN, Token.RPAREN);
 }