public XppAstExpr Parse()
 {
     while (true)
     {
         XppToken token = lexer.NextToken();
         if (token.TokenType == XppTokenType.EOF)
         {
             if (nodeStack.Count == 1)
             {
                 XppAstExpr expr = Pop().Node as XppAstExpr;
                 if (expr != null)
                 {
                     return(expr);
                 }
             }
             Debug.Fail("Parse error, reached EOF in an invalid state. Use a debugger to see what's left on the stack.");
             throw new ArgumentException(
                       "Parse error, reached EOF in an invalid state. Use a debugger to see what's left on the stack.");
         }
         Push(new XppParserSymbol(token.TokenType, token.Value, null));
         EvaluateStack();
     }
 }
 public XppCompositeExpr(bool or, XppAstExpr left, XppAstExpr right)
 {
     _or    = or;
     _left  = left;
     _right = right;
 }
 public XppCompositeExpr(bool or, XppAstExpr left, XppAstExpr right)
 {
     _or = or;
     _left = left;
     _right = right;
 }
 public XppAstNotExpr(XppAstExpr expr)
 {
     this.expr = expr;
 }
 public XppAstNotExpr(XppAstExpr expr)
 {
     this.expr = expr;
 }