private static SqlNode convert(PrecedenceClimbingParser.Token token) { switch (token.type) { case ATOM: return (SqlNode) token.o; case CALL: final PrecedenceClimbingParser.Call call = (PrecedenceClimbingParser.Call) token; final List<SqlNode> list = new ArrayList<>(); for (PrecedenceClimbingParser.Token arg : call.args) { list.add(convert(arg)); } final ToTreeListItem item = (ToTreeListItem) call.op.o; if (item.op == SqlStdOperatorTable.UNARY_MINUS && list.size() == 1 && list.get(0) instanceof SqlNumericLiteral) { return SqlLiteral.createNegative((SqlNumericLiteral) list.get(0), item.pos.plusAll(list)); } if (item.op == SqlStdOperatorTable.UNARY_PLUS && list.size() == 1 && list.get(0) instanceof SqlNumericLiteral) { return list.get(0); } return item.op.createCall(item.pos.plusAll(list), list); default: throw new AssertionError(token); } }
private static SqlNode convert(PrecedenceClimbingParser.Token token) { switch (token.type) { case ATOM: return (SqlNode) token.o; case CALL: final PrecedenceClimbingParser.Call call = (PrecedenceClimbingParser.Call) token; final List<SqlNode> list = new ArrayList<>(); for (PrecedenceClimbingParser.Token arg : call.args) { list.add(convert(arg)); } final ToTreeListItem item = (ToTreeListItem) call.op.o; if (item.op == SqlStdOperatorTable.UNARY_MINUS && list.size() == 1 && list.get(0) instanceof SqlNumericLiteral) { return SqlLiteral.createNegative((SqlNumericLiteral) list.get(0), item.pos.plusAll(list)); } if (item.op == SqlStdOperatorTable.UNARY_PLUS && list.size() == 1 && list.get(0) instanceof SqlNumericLiteral) { return list.get(0); } return item.op.createCall(item.pos.plusAll(list), list); default: throw new AssertionError(token); } }
parser.partialParse(); final int afterSize = parser.all().size(); final SqlNode node = convert(parser.all().get(0)); list.replaceSublist(start, start + beforeSize - afterSize + 1, node); return node;
parser.partialParse(); final int afterSize = parser.all().size(); final SqlNode node = convert(parser.all().get(0)); list.replaceSublist(start, start + beforeSize - afterSize + 1, node); return node;