Introduction To Languages And The Theory Of Computation by John Martin & Martin John