Split semantics from generated parser