docs: @SuppressWarnings("checkstyle:anoninnerlength")
  	protected StringConcatenationClient generateAccessors(Set<String> addedKeywords, Map<String, String> getters) {
  		return new StringConcatenationClient() {
  			@SuppressWarnings("synthetic-access")
  			@Override
  			protected void appendTo(TargetStringConcatenation it) {
  				it.append("\tprivate "); //$NON-NLS-1$
  				it.append(SoftReference.class);
  				it.append("<"); //$NON-NLS-1$
  				it.append(Set.class);
  				it.append("<String>> allKeywords;"); //$NON-NLS-1$
  				it.newLineIfNotEmpty();
  				it.newLine();
  				it.append("\t/** Replies the SARL keywords."); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t * @return the SARL keywords."); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t * @see #getPureKeywords()"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t */"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\tpublic "); //$NON-NLS-1$
  				it.append(Set.class);
  				it.append("<String> getKeywords() {"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\t"); //$NON-NLS-1$
  				it.append(Set.class);
  				it.append("<String> kws = this.allKeywords == null ? null : this.allKeywords.get();"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\tif (kws == null) {"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\t\tkws = new "); //$NON-NLS-1$
  				it.append(TreeSet.class);
  				it.append("<>();"); //$NON-NLS-1$
  				it.newLine();
  				final Pattern pattern = Pattern.compile("^[a-zA-Z_$]+$"); //$NON-NLS-1$
  				for (final Entry<String, String> getter : getters.entrySet()) {
  					if (pattern.matcher(getter.getValue()).matches()) {
  						it.append("\t\t\tkws.add(get"); //$NON-NLS-1$
  						it.append(getter.getKey());
  						it.append("());"); //$NON-NLS-1$
  						it.newLine();
  					}
  				}
  				it.append("\t\t\tthis.allKeywords = new "); //$NON-NLS-1$
  				it.append(SoftReference.class);
  				it.append("<>(kws);"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\t}"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\treturn "); //$NON-NLS-1$
  				it.append(Collections.class);
  				it.append(".unmodifiableSet(kws);"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t}"); //$NON-NLS-1$
  				it.newLineIfNotEmpty();
  				it.newLine();
  				it.append("\t/** Replies if the given string of characters is a SARL keyword."); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t * @param str the string of characters."); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t * @return <code>true</code> if the string of characters is a SARL keyword."); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t */"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\tpublic boolean isKeyword(String str) {"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\tassert !"); //$NON-NLS-1$
  				it.append(Strings.class);
  				it.append(".isEmpty(str);"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\treturn getKeywords().contains(str);"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t}"); //$NON-NLS-1$
  				it.newLineIfNotEmpty();
  				it.newLine();
  				it.append("\tprivate "); //$NON-NLS-1$
  				it.append(SoftReference.class);
  				it.append("<"); //$NON-NLS-1$
  				it.append(Set.class);
  				it.append("<String>> pureSarlKeywords;"); //$NON-NLS-1$
  				it.newLineIfNotEmpty();
  				it.newLine();
  				it.append("\t/** Replies the pure SARL keywords."); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t * Pure SARL keywords are SARL keywords that are not Java keywords."); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t * @return the pure SARL keywords."); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t */"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\tpublic "); //$NON-NLS-1$
  				it.append(Set.class);
  				it.append("<String> getPureKeywords() {"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\t"); //$NON-NLS-1$
  				it.append(Set.class);
  				it.append("<String> kws = this.pureSarlKeywords == null ? null : this.pureSarlKeywords.get();"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\tif (kws == null) {"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\t\tkws = new "); //$NON-NLS-1$
  				it.append(HashSet.class);
  				it.append("<>();"); //$NON-NLS-1$
  				it.newLine();
  				for (final Entry<String, String> getter : getters.entrySet()) {
  					if (pattern.matcher(getter.getValue()).matches()
  							&& !GrammarKeywordAccessFragment2.this.javaKeywords.isJavaKeyword(getter.getValue())) {
  						it.append("\t\t\tkws.add(get"); //$NON-NLS-1$
  						it.append(getter.getKey());
  						it.append("());"); //$NON-NLS-1$
  						it.newLine();
  					}
  				}
  				it.append("\t\t\tthis.pureSarlKeywords = new "); //$NON-NLS-1$
  				it.append(SoftReference.class);
  				it.append("<>(kws);"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\t}"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\treturn "); //$NON-NLS-1$
  				it.append(Collections.class);
  				it.append(".unmodifiableSet(kws);"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t}"); //$NON-NLS-1$
  				it.newLineIfNotEmpty();
  				it.newLine();
  				it.append("\t/** Replies if the given string of characters is a pure SARL keyword."); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t * Pure SARL keywords are SARL keywords that are not Java keywords."); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t * @param str the string of characters."); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t * @return <code>true</code> if the string of characters is a SARL keyword."); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t */"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\tpublic boolean isPureKeyword(String str) {"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\tassert !"); //$NON-NLS-1$
  				it.append(Strings.class);
  				it.append(".isEmpty(str);"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\treturn getPureKeywords().contains(str);"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t}"); //$NON-NLS-1$
  				it.newLineIfNotEmpty();
  				it.newLine();
  				it.append("\t/** Protect the given text if it is a keyword."); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t * @param text the text to protect."); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t * @return the protected text."); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t */"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\tpublic String protectKeyword(String text) {"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\tif (!"); //$NON-NLS-1$
  				it.append(Strings.class);
  				it.append(".isEmpty(text) && isKeyword(text)) {"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\t\treturn \""); //$NON-NLS-1$
  				it.append(Strings.convertToJavaString(GrammarKeywordAccessFragment2.this.configuration.getKeywordProtectionSymbol()));
  				it.append("\" + text;"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\t}"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\treturn text;"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t}"); //$NON-NLS-1$
  				it.newLineIfNotEmpty();
  				it.newLine();
  			}
  		};
  	}