internal EffectInstruction(IList <EffectToken> tokens, ref int index) { Opcode = tokens[index++]; string format; if (Opcode.MaybeInt32 && InstructionFormats.TryGetValue(Opcode.AsInt32, out format)) { if (Opcode.AsInt32 == 0x85) { while (index < tokens.Count && !tokens[index].IsFunction) { OperandsMutable.Add(tokens[index++]); } } else if (Opcode.AsInt32 == 0x88) { while (index < tokens.Count) { OperandsMutable.Add(tokens[index++]); } } else { foreach (char operandType in format) { if (index >= tokens.Count) { Opcode.AddError("Expected '{0}'; end of tokens.", operandType); break; } if (tokens[index].IsFunction) { tokens[index].AddError("Last instruction expected '{0}', not a function.", operandType); break; } var operand = tokens[index++]; OperandsMutable.Add(operand); switch (operandType) { case 'i': if (!operand.MaybeInt32) { operand.AddError("Expected an integer."); } break; case 'p': if (!operand.MaybePointer) { operand.AddError("Expected a pointer."); } break; case 'z': if (!operand.IsZero) { operand.AddError("Expected zero."); } break; case 's': if (!operand.MaybeSingle) { operand.AddError("Expected a Single."); } break; } } } } else { Opcode.AddError("Opcode is unknown or invalid; operands are crap."); while (index < tokens.Count && !(tokens[index].MaybeInt32 && InstructionFormats.ContainsKey(tokens[index].AsInt32)) && !tokens[index].IsFunction) { OperandsMutable.Add(tokens[index++]); } } }