private int stringLiteral(final Token token, final String text,
			final int start, final int prefixLength, final int length) {

		final char quotationMark = text.charAt(start + prefixLength);
		
		int position = start + prefixLength + 1;
		while (position < length) {
			final char c = text.charAt(position);

			if (c != quotationMark) {
				// Still in string literal.
				position += 1;
				continue;
			}

			if (position + 1 == length) {
				final Token stringliteral = token.subtoken(start);
				stringliteral.addTag(AreaTag.PROGRAM_TEXT_AREA);
				stringliteral.addTag(SyntacticTag.CHARACTER_STRING);
				stringliteral.addTag(SyntacticTag.STRING_LITERAL);
				if (LOGGER.isTraceEnabled()) {
					LOGGER.trace("String literal: " + stringliteral);
				}
				enqueue(stringliteral);
				return position + 1;
			}

			final char d = text.charAt(position + 1);

			if (d == quotationMark) {
				// Escaped quotation mark.
				position += 2;
				continue;
			}

			// Completed string literal.
			final Token stringliteral = token.subtoken(start, position + 1);
			stringliteral.addTag(AreaTag.PROGRAM_TEXT_AREA);
			stringliteral.addTag(SyntacticTag.CHARACTER_STRING);
			stringliteral.addTag(SyntacticTag.STRING_LITERAL);
			if (LOGGER.isTraceEnabled()) {
				LOGGER.trace("String literal: " + stringliteral);
			}
			enqueue(stringliteral);
			return position + 1;
		}

		// TODO Incomplete string literal. Throw error?
		final Token stringliteral = token.subtoken(start);
		stringliteral.addTag(AreaTag.PROGRAM_TEXT_AREA);
		stringliteral.addTag(SyntacticTag.CHARACTER_STRING);
		stringliteral.addTag(SyntacticTag.STRING_LITERAL);
		if (LOGGER.isTraceEnabled()) {
			LOGGER.trace("Incomplete string literal: " + stringliteral);
		}
		enqueue(stringliteral);
		return length;
	}