private static boolean hasOr(Expr expr) { for (; ; ) { switch (expr.type()) { case AND: if (hasOr(expr.left())) return true; expr = expr.right(); break; case OR: return expr.left().type() != STEREOCHEMISTRY || expr.right().type() != STEREOCHEMISTRY || expr.right().value() != 0; case SINGLE_OR_AROMATIC: case SINGLE_OR_DOUBLE: case DOUBLE_OR_AROMATIC: return true; default: return false; } } }
if (generateBond(sb, expr.left())) { sb.append(','); if (!generateBond(sb, expr.right())) sb.setLength(sb.length() - 1); return true; } else if (generateBond(sb, expr.right())) return true; else return false; case AND: boolean lowPrec = hasOr(expr.left()) || hasOr(expr.right()); if (generateBond(sb, expr.left())) { if (lowPrec) sb.append(';'); if (!generateBond(sb, expr.right()) && lowPrec) sb.setLength(sb.length() - 1); return true; } else if (generateBond(sb, expr.right())) return true; else
boolean hasAliphaticDoubleBond(Expr expr) { for (; ; ) { switch (expr.type()) { case NOT: expr = expr.left(); break; case AND: case OR: if (hasAliphaticDoubleBond(expr.left())) return true; expr = expr.right(); break; case ALIPHATIC_ORDER: return expr.value() == 2; default: return false; } } }
private static int getBondStereoFlag(Expr expr) { switch (expr.type()) { case STEREOCHEMISTRY: switch (expr.value()) { case 0: return BSTEREO_UNSPEC; case IStereoElement.TOGETHER: return BSTEREO_CIS; case IStereoElement.OPPOSITE: return BSTEREO_TRANS; default: throw new IllegalArgumentException(); } case OR: return getBondStereoFlag(expr.left()) | getBondStereoFlag(expr.right()); case AND: return getBondStereoFlag(expr.left()) & getBondStereoFlag(expr.right()); case NOT: return ~getBondStereoFlag(expr.left()); default: return BSTEREO_ANY; } }
@Test public void testLeftBalancedAnd2() { Expr expr1 = new Expr(ELEMENT, 9); Expr expr2 = new Expr(DEGREE, 2).and(new Expr(HAS_IMPLICIT_HYDROGEN)); expr2.and(expr1); assertThat(expr2.left().type(), is(DEGREE)); assertThat(expr2.right().type(), is(AND)); assertThat(expr2.right().left().type(), is(HAS_IMPLICIT_HYDROGEN)); assertThat(expr2.right().right().type(), is(ELEMENT)); }
generateAtom(sb, atom, expr.right(), withDisjunction); return; } else if (expr.right().type() == REACTION_ROLE) { generateAtom(sb, atom, expr.left(), withDisjunction); return; boolean disjuncBelow = hasOr(expr.left()) || hasOr(expr.right()); if (disjuncBelow) { generateAtom(sb, atom, expr.left(), true); int mark = sb.length(); if (hasOr(expr.right())) generateRecurAtom(sb, atom, expr.right()); else generateAtom(sb, atom, expr.right(), true); maybeExplAnd(sb, mark); } else { generateAtom(sb, atom, expr.left(), false); sb.append(';'); generateAtom(sb, atom, expr.right(), false); generateAtom(sb, atom, expr.right(), withDisjunction); maybeExplAnd(sb, mark); case OR: if (expr.left().type() == STEREOCHEMISTRY && expr.right().type() == STEREOCHEMISTRY && expr.right().value() == 0) { generateAtom(sb, atom, expr.left(), true);
/** * Traverse an expression tree and flip all the stereo expressions. */ void flip(Expr expr) { for (; ; ) { switch (expr.type()) { case STEREOCHEMISTRY: if (expr.value() != 0) expr.setPrimitive(expr.type(), expr.value() ^ 0x3); return; case AND: case OR: flip(expr.left()); expr = expr.right(); break; case NOT: expr = expr.left(); break; } } }
case OR: Expr left = strip(expr.left(), type); Expr right = strip(expr.right(), type); if (left != null && right != null) expr.setLogical(expr.type(), left, right);
case OR: Expr sub1 = determineBondStereo(left.left(), right); Expr sub2 = determineBondStereo(left.right(), right); if (sub1 != null && sub2 != null) return new Expr(left.type(), sub1, sub2); case OR: sub1 = determineBondStereo(left, right.left()); sub2 = determineBondStereo(left, right.right()); if (sub1 != null && sub2 != null) return new Expr(right.type(), sub1, sub2);