Pure Python EBNF parser