A target-agnostic LL(1) parser generator