Source: https://courses.cs.washington.edu/courses/cse142/09su/lectures/2009-07-13_ch03-3/09-ch03-3-scanner.pdf