docs: public void process(Element elem, GenerateEmbeddedDSL annotation,
  			Elements elementUtils, Types typeUtils, Filer filer, Reporter reporter) throws IOException {
  		
  		if(!ElementUtils.checkElementKind(elem, ElementKind.CLASS, ElementKind.INTERFACE)) {
  			throw new IllegalArgumentException("Annotation " + GenerateEmbeddedDSL.class.getSimpleName()
  					+ " can only be used on class or interface declarations!");
  		}
  		
  		TypeElement te = (TypeElement)elem;
  		
  		ReporterDiagnosticListener dl = new ReporterDiagnosticListener(reporter);
  		
  		DSLSettings settings = new DSLSettings(annotation);
  		
  		DSLSpecification spec = DSLSpecification.create(te, settings, elementUtils, typeUtils);
  		
  		BricsCompiler compiler = new BricsCompiler(spec.getImplementation());
  		
  		DuzztAutomaton automaton = compiler.compile(spec.getDSLSyntax(), spec.getSubExpressions());
  
  		// Make sure classes have same name if generated twice from the same spec
  		automaton.reassignStateIds(typeUtils);
  		
  		render(spec, automaton, filer, dl);
  	}