1. A method comprising: accessing first grammar data associated with a first grammar and second grammar data associated with a second grammar, wherein a grammar comprises one or more rules that define a programming language that corresponds to the grammar; determining from the first grammar data and the second grammar data whether the first grammar and the second grammar correspond to the same programming language, wherein determining whether the first grammar and the second grammar correspond to the same programming language includes: applying one or more transformational steps to both the first grammar data and the second grammar data; after each transformational step, determining whether the first grammar data and the second grammar data correspond; in accordance with a determination that the first grammar data and the second grammar data correspond, determining that the first grammar and the second grammar both correspond to the same programming language; and in accordance with a determination that the first grammar data and the second grammar data do not correspond, selecting a next transformational step in the one or more transformational steps, wherein prior to selecting the next transformational step: determining whether there are any remaining transformational steps, and in accordance with a determination that there are no remaining transformational steps, determining that the first grammar and the second grammar do not correspond to the same programming language.