private static Expr ParseCall(IEnumerator <string> tokens, string argName, string foldItemName, string foldAccName) { Func <Expr> parse = () => ParseExpr(tokens, argName, foldItemName, foldAccName); tokens.SkipToken("("); var t = tokens.ExtractToken(); Expr res; if (t == "if0") { res = new If0(parse(), parse(), parse()); } else if (t == "fold") { res = ParseFold(tokens, argName, foldItemName, foldAccName); } else if (t == "not") { res = new UnaryNot(parse()); } else if (t == "shl1") { res = new UnaryShl1(parse()); } else if (t == "shr1") { res = new UnaryShr1(parse()); } else if (t == "shr4") { res = new UnaryShr4(parse()); } else if (t == "shr16") { res = new UnaryShr16(parse()); } else if (t == "and") { res = new BinaryAnd(parse(), parse()); } else if (t == "or") { res = new BinaryOr(parse(), parse()); } else if (t == "xor") { res = new BinaryXor(parse(), parse()); } else if (t == "plus") { res = new BinaryPlus(parse(), parse()); } else { throw new FormatException("unknown function " + t); } tokens.SkipToken(")"); return(res); }
public void Unify(If0 x) { Unify(x.cond); Unify(x.falseExpr); Unify(x.trueExpr); }