Пример #1
0
        PluralFormsNode LogicalAndExpression()
        {
            PluralFormsNode p = EqualityExpression();

            if (p == null)
            {
                return(null);
            }
            PluralFormsNode ln = p;             // left

            if (Token.TokenType == PluralFormsToken.Type.LogicalAnd)
            {
                PluralFormsNode un = new PluralFormsNode(new PluralFormsToken(Token));                 // up
                if (!NextToken())
                {
                    return(null);
                }
                p = LogicalAndExpression();
                if (p == null)
                {
                    return(null);
                }
                PluralFormsNode rn = p;                 // right
                if (rn.Token.TokenType == PluralFormsToken.Type.LogicalAnd)
                {
                    // transform 1 && (2 && 3) -> (1 && 2) && 3
                    //     u                  r
                    // l       r     ->   u      3
                    //       2   3      l   2
                    un.SetNode(0, ln);
                    un.SetNode(1, rn.ReleaseNode(0));
                    rn.SetNode(0, un);
                    return(rn);
                }

                un.SetNode(0, ln);
                un.SetNode(1, rn);
                return(un);
            }
            return(ln);
        }
Пример #2
0
        PluralFormsNode LogicalOrExpression()
        {
            PluralFormsNode p = LogicalAndExpression();

            if (p == null)
            {
                return(null);
            }
            PluralFormsNode ln = p;

            if (Token.TokenType == PluralFormsToken.Type.LogicalOr)
            {
                PluralFormsNode un = new PluralFormsNode(new PluralFormsToken(Token));
                if (!NextToken())
                {
                    return(null);
                }
                p = LogicalOrExpression();
                if (p == null)
                {
                    return(null);
                }
                PluralFormsNode rn = p;                 // right
                if (rn.Token.TokenType == PluralFormsToken.Type.LogicalOr)
                {
                    // see logicalAndExpression comment
                    un.SetNode(0, ln);
                    un.SetNode(1, rn.ReleaseNode(0));
                    rn.SetNode(0, un);
                    return(rn);
                }

                un.SetNode(0, ln);
                un.SetNode(1, rn);
                return(un);
            }
            return(ln);
        }