abstract static private class AST implements Cloneable {
final int  _cols;
final long _rows;
AST( int cols, long rows ) { _cols=cols; _rows=rows; }
static AST parseCXExpr(Exec2 E ) {
<BUG>AST ast = parseExpr(E);

if( ast == null ) return null;
AST ast2 = ASTOp2.parseInfix(E,ast); // Infix op, or not?
if( ast2 != null ) return ast2;
if( ast instanceof ASTKey && E.peek('=') ) { throw H2O.unimpl(); } // assignment
if( ast instanceof ASTKey && E.peek('[') ) { throw H2O.unimpl(); } // subset assignment</BUG>
if( ast.isScalar() && E.peek('?') ) { throw H2O.unimpl(); } // infix trinary

abstract static private class AST implements Cloneable {
final int  _cols;
final long _rows;
AST( int cols, long rows ) { _cols=cols; _rows=rows; }
static AST parseCXExpr(Exec2 E ) {
AST ast2, ast = parseExpr(E);
if( ast == null ) return null;
if( (ast2 = ASTOp2.parseInfix(E,ast)) != null ) return ast2;
if( (ast2 = ASTAssign.parse  (E,ast)) != null ) return ast2;
if( ast.isScalar() && E.peek('?') ) { throw H2O.unimpl(); } // infix trinary
