private PExp buildStructuralLessThan(PExp left_exp, PExp right_exp, int tupleCounter, int recCounter) { // left.i AFieldNumberExp leftField_exp = new AFieldNumberExp(); leftField_exp.setTuple(left_exp.clone()); leftField_exp.setField(new LexIntegerToken(tupleCounter, null)); // right.i AFieldNumberExp rightField_exp = new AFieldNumberExp(); rightField_exp.setTuple(right_exp.clone()); rightField_exp.setField(new LexIntegerToken(tupleCounter, null)); if (recCounter == 1) { // last one. don't chain further ifs return AstExpressionFactory.newAGreaterNumericBinaryExp(leftField_exp, rightField_exp); } // left.i <> right.i ANotEqualBinaryExp notEquals_exp = AstExpressionFactory.newANotEqualBinaryExp(leftField_exp, rightField_exp); // if left.i <>right.i then left.i , right.i else [recurse] AGreaterNumericBinaryExp gt_exp = AstExpressionFactory.newAGreaterNumericBinaryExp(leftField_exp.clone(), rightField_exp.clone()); AIfExp if_exp = new AIfExp(); if_exp.setTest(notEquals_exp); if_exp.setThen(gt_exp); if_exp.setElse(buildStructuralLessThan(left_exp.clone(), right_exp.clone(), tupleCounter + 1, recCounter - 1)); return if_exp; }