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; } }
case NOT: sb.append('!'); if (!generateBond(sb, expr.left())) { sb.setLength(sb.length() - 1); return false; if (generateBond(sb, expr.left())) { sb.append(','); if (!generateBond(sb, expr.right())) return false; case AND: boolean lowPrec = hasOr(expr.left()) || hasOr(expr.right()); if (generateBond(sb, expr.left())) { if (lowPrec) sb.append(';');
/** * 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; } } }
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 (expr.left().type() == REACTION_ROLE) { 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) { if (hasOr(expr.left())) generateRecurAtom(sb, atom, expr.left()); else generateAtom(sb, atom, expr.left(), true); int mark = sb.length(); if (hasOr(expr.right())) maybeExplAnd(sb, mark); } else { generateAtom(sb, atom, expr.left(), false); sb.append(';'); generateAtom(sb, atom, expr.right(), false); generateAtom(sb, atom, expr.left(), withDisjunction); int mark = sb.length(); generateAtom(sb, atom, expr.right(), withDisjunction); if (expr.left().type() == STEREOCHEMISTRY && expr.right().type() == STEREOCHEMISTRY &&
@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)); }
@Test public void testLeftBalancedOr1() { Expr expr1 = new Expr(ELEMENT, 9); Expr expr2 = new Expr(ELEMENT, 17).or(new Expr(ELEMENT, 35)); expr1.or(expr2); assertThat(expr1.left().type(), is(ELEMENT)); }
case AND: case OR: Expr sub1 = determineBondStereo(left.left(), right); Expr sub2 = determineBondStereo(left.right(), right); if (sub1 != null && sub2 != null) return null; case NOT: sub1 = determineBondStereo(left.left(), right); if (sub1 != null) return sub1.negate(); case AND: case OR: sub1 = determineBondStereo(left, right.left()); sub2 = determineBondStereo(left, right.right()); if (sub1 != null && sub2 != null) return null; case NOT: sub1 = determineBondStereo(left, right.left()); if (sub1 != null) return sub1.negate();
@Test public void testLeftBalancedOr2() { Expr expr1 = new Expr(ELEMENT, 9); Expr expr2 = new Expr(ELEMENT, 17).or(new Expr(ELEMENT, 35)); expr2.or(expr1); assertThat(expr2.left().type(), is(ELEMENT)); }
@Test public void testLeftBalancedAnd1() { Expr expr1 = new Expr(ELEMENT, 9); Expr expr2 = new Expr(DEGREE, 2).and(new Expr(HAS_IMPLICIT_HYDROGEN)); expr1.and(expr2); assertThat(expr1.left().type(), is(ELEMENT)); }