Source: http://deptinfo.cnam.fr/~rosmorse/nfa016/pdf/JavaScript2.pdf