Languages and Machines An Introduction to the Theory of Computer Science