docs: protected void generateDefinitions(IXmlStyleAppendable it, Set<String> literals, Iterable<String> keywords,
  			Set<String> punctuation) {
  		it.appendTagWithValue("define-regex", lines("\t", //$NON-NLS-1$ //$NON-NLS-2$
  				"", //$NON-NLS-1$
  				"\\\\(               # leading backslash", //$NON-NLS-1$
  				"[\\\\\\\"\\'nrbtf] |   # escaped character", //$NON-NLS-1$
  				"[0-9]{1,3}    |   # latin encoded char", //$NON-NLS-1$
  				"u[0-9]{1,4}       # unicode char", //$NON-NLS-1$
  				")"), //$NON-NLS-1$
  				"id", "escaped-character", //$NON-NLS-1$ //$NON-NLS-2$
  				"extended", "true"); //$NON-NLS-1$ //$NON-NLS-2$
  
  		it.appendTagWithValue("define-regex", //$NON-NLS-1$
  				"0[xX][0-9a-fA-F_]+(#(([bB][iI])|([lL])))?", //$NON-NLS-1$
  				"id", "hex-number"); //$NON-NLS-1$ //$NON-NLS-2$
  
  		it.appendTagWithValue("define-regex", //$NON-NLS-1$
  				"[0-9][0-9_]*", //$NON-NLS-1$
  				"id", "int-number"); //$NON-NLS-1$ //$NON-NLS-2$
  
  		it.appendTagWithValue("define-regex", //$NON-NLS-1$
  				"\\%{int-number}([eE][+\\-]?\\%{int-number})?(([bB][iIdD])|([lLdDfF]))?", //$NON-NLS-1$
  				"id", "decimal-number"); //$NON-NLS-1$ //$NON-NLS-2$
  
  		it.appendTagWithValue("define-regex", //$NON-NLS-1$
  				"(\\%{hex-number})|(\\%{decimal-number}(\\.\\%{decimal-number})?)", //$NON-NLS-1$
  				"id", "sarl-number"); //$NON-NLS-1$ //$NON-NLS-2$
  
  		it.appendTagWithValue("define-regex", //$NON-NLS-1$
  				"\\^?[a-zA-Z_$][a-zA-Z_$0-9]*", //$NON-NLS-1$
  				"id", "sarl-identifier"); //$NON-NLS-1$ //$NON-NLS-2$
  
  		final IXmlStyleCloseable tag1 = it.open("context", //$NON-NLS-1$
  				"id", "qq-string", //$NON-NLS-1$ //$NON-NLS-2$
  				"style-ref", "string", //$NON-NLS-1$ //$NON-NLS-2$
  				"end-at-line-end", "true", //$NON-NLS-1$ //$NON-NLS-2$
  				"class", "string", //$NON-NLS-1$ //$NON-NLS-2$
  				"class-disabled", "no-spell-check"); //$NON-NLS-1$ //$NON-NLS-2$
  		tag1.appendTagWithValue("start", "\""); //$NON-NLS-1$ //$NON-NLS-2$
  		tag1.appendTagWithValue("end", "\""); //$NON-NLS-1$ //$NON-NLS-2$
  		final IXmlStyleCloseable tag2 = tag1.open("include"); //$NON-NLS-1$
  		final IXmlStyleCloseable tag3 = tag2.open("context", //$NON-NLS-1$
  				"id", "qq-string-escaped-character", //$NON-NLS-1$ //$NON-NLS-2$
  				"style-ref", "escaped-character"); //$NON-NLS-1$ //$NON-NLS-2$
  		tag3.appendTagWithValue("match", "\\%{escaped-character}"); //$NON-NLS-1$ //$NON-NLS-2$
  		tag3.close();
  		tag2.close();
  		tag1.close();
  
  		final IXmlStyleCloseable tag4 = it.open("context", //$NON-NLS-1$
  				"id", "q-string", //$NON-NLS-1$ //$NON-NLS-2$
  				"style-ref", "string", //$NON-NLS-1$ //$NON-NLS-2$
  				"end-at-line-end", "true", //$NON-NLS-1$ //$NON-NLS-2$
  				"class", "string", //$NON-NLS-1$ //$NON-NLS-2$
  				"class-disabled", "no-spell-check"); //$NON-NLS-1$ //$NON-NLS-2$
  		tag4.appendTagWithValue("start", "'"); //$NON-NLS-1$ //$NON-NLS-2$
  		tag4.appendTagWithValue("end", "'"); //$NON-NLS-1$ //$NON-NLS-2$
  		final IXmlStyleCloseable tag5 = tag4.open("include"); //$NON-NLS-1$
  		final IXmlStyleCloseable tag6 = tag5.open("context", //$NON-NLS-1$
  				"id", "q-string-escaped-character", //$NON-NLS-1$ //$NON-NLS-2$
  				"style-ref", "escaped-character"); //$NON-NLS-1$ //$NON-NLS-2$
  		tag6.appendTagWithValue("match", "\\%{escaped-character}"); //$NON-NLS-1$ //$NON-NLS-2$
  		tag6.close();
  		tag5.close();
  		tag4.close();
  
  		final IXmlStyleCloseable tag7 = it.open("context", //$NON-NLS-1$
  				"id", "line-comment", //$NON-NLS-1$ //$NON-NLS-2$
  				"style-ref", "comment", //$NON-NLS-1$ //$NON-NLS-2$
  				"end-at-line-end", "true", //$NON-NLS-1$ //$NON-NLS-2$
  				"class", "comment", //$NON-NLS-1$ //$NON-NLS-2$
  				"class-disabled", "no-spell-check"); //$NON-NLS-1$ //$NON-NLS-2$
  		tag7.appendTagWithValue("start", "//"); //$NON-NLS-1$ //$NON-NLS-2$
  		final IXmlStyleCloseable tag8 = tag7.open("include"); //$NON-NLS-1$
  		tag8.appendTag("context", //$NON-NLS-1$
  				"ref", "def:in-line-comment"); //$NON-NLS-1$ //$NON-NLS-2$
  		tag8.close();
  		tag7.close();
  
  		final IXmlStyleCloseable tag9 = it.open("context", //$NON-NLS-1$
  				"id", "block-comment", //$NON-NLS-1$ //$NON-NLS-2$
  				"style-ref", "comment", //$NON-NLS-1$ //$NON-NLS-2$
  				"class", "comment", //$NON-NLS-1$ //$NON-NLS-2$
  				"class-disabled", "no-spell-check"); //$NON-NLS-1$ //$NON-NLS-2$
  		tag9.appendTagWithValue("start", "/\\*"); //$NON-NLS-1$ //$NON-NLS-2$
  		tag9.appendTagWithValue("end", "\\*/"); //$NON-NLS-1$ //$NON-NLS-2$
  		final IXmlStyleCloseable tag10 = tag9.open("include"); //$NON-NLS-1$
  		tag10.appendTag("context", //$NON-NLS-1$
  				"ref", "def:in-comment"); //$NON-NLS-1$ //$NON-NLS-2$
  		tag10.close();
  		tag9.close();
  
  		final IXmlStyleCloseable tag11 = it.open("context", //$NON-NLS-1$
  				"id", "close-comment-outside-comment", //$NON-NLS-1$ //$NON-NLS-2$
  				"style-ref", "error"); //$NON-NLS-1$ //$NON-NLS-2$
  		tag11.appendTagWithValue("match", "\\*/(?!\\*)"); //$NON-NLS-1$ //$NON-NLS-2$
  		tag11.close();
  
  		final IXmlStyleCloseable tag12 = it.open("context", //$NON-NLS-1$
  				"id", "sarl-keywords", //$NON-NLS-1$ //$NON-NLS-2$
  				"style-ref", "keyword"); //$NON-NLS-1$ //$NON-NLS-2$
  		for (final String keyword : keywords) {
  			tag12.appendTagWithValue("keyword", keyword); //$NON-NLS-1$
  		}
  		tag12.close();
  
  		final IXmlStyleCloseable tag13 = it.open("context", //$NON-NLS-1$
  				"id", "sarl-literals", //$NON-NLS-1$ //$NON-NLS-2$
  				"style-ref", "literal"); //$NON-NLS-1$ //$NON-NLS-2$
  		for (final String literal : literals) {
  			tag13.appendTagWithValue("keyword", literal); //$NON-NLS-1$
  		}
  		tag13.close();
  
  		final IXmlStyleCloseable tag14 = it.open("context", //$NON-NLS-1$
  				"id", "annotations", //$NON-NLS-1$ //$NON-NLS-2$
  				"style-ref", "annotation"); //$NON-NLS-1$ //$NON-NLS-2$
  		tag14.appendTagWithValue("match", "\\@\\%{sarl-identifier}(\\.\\%{sarl-identifier})*"); //$NON-NLS-1$ //$NON-NLS-2$
  		tag14.close();
  
  		final IXmlStyleCloseable tag15 = it.open("context", //$NON-NLS-1$
  				"id", "identifiers", //$NON-NLS-1$ //$NON-NLS-2$
  				"style-ref", "identifier"); //$NON-NLS-1$ //$NON-NLS-2$
  		tag15.appendTagWithValue("match", "\\%{sarl-identifier}"); //$NON-NLS-1$ //$NON-NLS-2$
  		tag15.close();
  
  		final IXmlStyleCloseable tag16 = it.open("context", //$NON-NLS-1$
  				"id", "numeric", //$NON-NLS-1$ //$NON-NLS-2$
  				"style-ref", "number"); //$NON-NLS-1$ //$NON-NLS-2$
  		tag16.appendTagWithValue("match", "\\%{sarl-number}"); //$NON-NLS-1$ //$NON-NLS-2$
  		tag16.close();
  
  		final IXmlStyleCloseable tag17 = it.open("context", //$NON-NLS-1$
  				"id", "operators", //$NON-NLS-1$ //$NON-NLS-2$
  				"style-ref", "operator", //$NON-NLS-1$ //$NON-NLS-2$
  				"extend-parent", "false"); //$NON-NLS-1$ //$NON-NLS-2$
  		StringBuilder buffer = new StringBuilder();
  		final Set<Character> characters = new TreeSet<>();
  		for (final String operator : punctuation) {
  			if (buffer.length() > 0) {
  				buffer.append("|"); //$NON-NLS-1$
  			}
  			buffer.append("("); //$NON-NLS-1$
  			buffer.append(RegexpExtensions.toRegexpString(operator, false));
  			buffer.append(")"); //$NON-NLS-1$
  			operator.chars().forEach(c -> characters.add((char) c));
  		}
  		tag17.appendTagWithValue("match", buffer.toString()); //$NON-NLS-1$
  		tag17.close();
  
  		final IXmlStyleCloseable tag18 = it.open("context", //$NON-NLS-1$
  				"id", "invalid-operators", //$NON-NLS-1$ //$NON-NLS-2$
  				"style-ref", "error"); //$NON-NLS-1$ //$NON-NLS-2$
  		buffer = new StringBuilder();
  		for (final Character character : characters) {
  			buffer.append(RegexpExtensions.toRegexpString(character.toString(), false));
  		}
  		tag18.appendTagWithValue("match", "[" + buffer.toString() + "]+"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
  		tag18.close();
  
  		final IXmlStyleCloseable tag19 = it.open("context", //$NON-NLS-1$
  				"id", getLanguageSimpleName().toLowerCase(), //$NON-NLS-1$
  				"class", "no-spell-check"); //$NON-NLS-1$ //$NON-NLS-2$
  		final IXmlStyleCloseable tag20 = tag19.open("include"); //$NON-NLS-1$
  		tag20.appendTag("context", "ref", "qq-string"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
  		tag20.appendTag("context", "ref", "q-string"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
  		tag20.appendTag("context", "ref", "line-comment"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
  		tag20.appendTag("context", "ref", "block-comment"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
  		tag20.appendTag("context", "ref", "close-comment-outside-comment"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
  		tag20.appendTag("context", "ref", "sarl-keywords"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
  		tag20.appendTag("context", "ref", "sarl-literals"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
  		tag20.appendTag("context", "ref", "annotations"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
  		tag20.appendTag("context", "ref", "identifiers"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
  		tag20.appendTag("context", "ref", "numeric"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
  		tag20.appendTag("context", "ref", "operators"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
  		tag20.close();
  		tag19.close();
  	}