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); }
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); }