/** * Parses a bitwise XOR expression <i>x '^' y</i>. * * @param required true, if the expression is required. * @return The generated term. * @throws ParseException if a parse error occurs */ private Term parseBtwiseXOr(final boolean required) throws ParseException { Term t1 = parseBitwiseAnd(required); while (t1 != null) { int tt = tokenizer.next(); if (tt == '^') { Term t2 = parseBitwiseAnd(true); if ((t1.isI() && t2.isI()) || !isTypeChecking()) { t1 = new Term.XOrI(t1, t2); } else { reportTypeErrorI2("'^'"); } } else { tokenizer.pushBack(); break; } } return t1; }
/** * Parses a bitwise OR expression <i>x '|' y</i>. * * @param required true, if the expression is required. * @return The generated term. * @throws ParseException if a parse error occurs */ private Term parseBitwiseOr(final boolean required) throws ParseException { Term t1 = parseBtwiseXOr(required); while (t1 != null) { int tt = tokenizer.next(); if (tt == '|') { Term t2 = parseBtwiseXOr(true); if ((t1.isI() && t2.isI()) || !isTypeChecking()) { t1 = new Term.OrI(t1, t2); } else { reportTypeErrorI2("'|'"); } } else { tokenizer.pushBack(); break; } } return t1; }
/** * Parses a bitwise AND expression <i>x '&' y</i>. * * @param required true, if the expression is required. * @return The generated term. * @throws ParseException if a parse error occurs */ private Term parseBitwiseAnd(final boolean required) throws ParseException { Term t1 = parseAdd(required); while (t1 != null) { int tt = tokenizer.next(); if (tt == '&') { Term t2 = parseAdd(true); if ((t1.isI() && t2.isI()) || !isTypeChecking()) { t1 = new Term.AndI(t1, t2); } else { reportTypeErrorI2("'&'"); } } else { tokenizer.pushBack(); break; } } return t1; }
if (t2.isI() || t2.isD()) { t1 = t2; } else if (!isTypeChecking()) { t1 = t2; } else { } else if (t2.isD()) { t1 = new Term.Neg(Term.TYPE_D, t2); } else if (!isTypeChecking()) { t1 = new Term.Neg(Term.TYPE_I, t2); } else { if (t2.isB() || !isTypeChecking()) { t1 = new Term.NotB(t2); } else { if (t2.isI() || !isTypeChecking()) { t1 = new Term.NotI(t2); } else {
private Term createConditionTerm(Term t1, Term t2, Term t3) throws ParseException { if (t2.isB() && t3.isB()) { return new Term.Cond(Term.TYPE_B, t1, t2, t3); } else if ((t2.isD() && t3.isN() || t2.isN() && t3.isD())) { return new Term.Cond(Term.TYPE_D, t1, t2, t3); } else if ((t2.isI() && t3.isI())) { return new Term.Cond(Term.TYPE_I, t1, t2, t3); } else if (!isTypeChecking()) { return new Term.Cond(Term.TYPE_D, t1, t2, t3); } else { reportError("Boolean or numeric operands expected in conditional term."); return null; } }
/** * Parses a logical OR expression <i>x '||' y</i>. * * @param required true, if the expression is required. * @return The generated term. * @throws ParseException if a parse error occurs */ private Term parseLogicalOr(final boolean required) throws ParseException { Term t1 = parseLogicalAnd(required); while (t1 != null) { /*int tt =*/ tokenizer.next(); if (isSpecial("||") || isKeyword("or")) { Term t2 = parseLogicalAnd(true); if ((t1.isB() && t2.isB()) || !isTypeChecking()) { t1 = new Term.OrB(t1, t2); } else { reportTypeErrorB2("'||' or 'or'"); } } else { tokenizer.pushBack(); break; } } return t1; }
/** * Parses a logical AND expression <i>x '&&' y</i>. * * @param required true, if the expression is required. * @return The generated term. * @throws ParseException if a parse error occurs */ private Term parseLogicalAnd(final boolean required) throws ParseException { Term t1 = parseComparison(required); while (t1 != null) { /*int tt =*/ tokenizer.next(); if (isSpecial("&&") || isKeyword("and")) { Term t2 = parseComparison(true); if ((t1.isB() && t2.isB()) || !isTypeChecking()) { t1 = new Term.AndB(t1, t2); } else { reportTypeErrorB2("'&&' or 'and'"); } } else { tokenizer.pushBack(); break; } } return t1; }
} else if (t1.isI() && t2.isI()) { t1 = new Term.Add(Term.TYPE_I, t1, t2); } else if (!isTypeChecking()) { t1 = new Term.Add(t1.isD() || t2.isD() ? Term.TYPE_D : Term.TYPE_I, t1, t2); } else { } else if (t1.isI() && t2.isI()) { t1 = new Term.Sub(Term.TYPE_I, t1, t2); } else if (!isTypeChecking()) { t1 = new Term.Sub(t1.isD() || t2.isD() ? Term.TYPE_D : Term.TYPE_I, t1, t2); } else {
} else if (t1.isI() && t2.isI()) { t1 = new Term.Mul(Term.TYPE_I, t1, t2); } else if (!isTypeChecking()) { t1 = new Term.Mul(t1.isD() || t2.isD() ? Term.TYPE_D : Term.TYPE_I, t1, t2); } else { } else if (t1.isI() && t2.isI()) { t1 = new Term.Div(Term.TYPE_I, t1, t2); } else if (!isTypeChecking()) { t1 = new Term.Div(t1.isD() || t2.isD() ? Term.TYPE_D : Term.TYPE_I, t1, t2); } else { } else if (t1.isI() && t2.isI()) { t1 = new Term.Mod(Term.TYPE_I, t1, t2); } else if (!isTypeChecking()) { t1 = new Term.Mod(t1.isD() || t2.isD() ? Term.TYPE_D : Term.TYPE_I, t1, t2); } else {
} else if (t1.isI() && t2.isI()) { t1 = new Term.LtI(t1, t2); } else if (!isTypeChecking()) { t1 = new Term.LtD(t1, t2); } else { } else if (t1.isI() && t2.isI()) { t1 = new Term.GtI(t1, t2); } else if (!isTypeChecking()) { t1 = new Term.GtD(t1, t2); } else { } else if (t1.isI() && t2.isI()) { t1 = new Term.EqI(t1, t2); } else if (!isTypeChecking()) { t1 = new Term.EqD(t1, t2); } else { } else if (t1.isI() && t2.isI()) { t1 = new Term.NEqI(t1, t2); } else if (!isTypeChecking()) { t1 = new Term.NEqD(t1, t2); } else { } else if (t1.isI() && t2.isI()) { t1 = new Term.LeI(t1, t2); } else if (!isTypeChecking()) { t1 = new Term.LeD(t1, t2); } else {
tokenizer.next(); if (isKeyword("else")) { if (isTypeChecking() && !t1.isB()) { reportError("Boolean operand expected after 'if' in conditional term."); tt = tokenizer.next(); if (tt == ':') { if (isTypeChecking() && !t1.isB()) { reportError("Boolean operand expected before '?' in conditional term.");