boolean clauseChainSpec(int tok) {
		if (tok == Token.colon) {
			tokenNext();
			tok = tokPeek();
			if (isSpecTerminator(tok))
				return generateResidueSpecCode(new Token(Token.spec_chain, '\0', "spec_chain"));
		}
		if (tok == Token.asterisk) {
			tokenNext();
			return true;
		}
		Token tokenChain;
		char chain;
		switch (tok) {
		// case Token.colon:
		// case Token.percent:
		// case Token.nada:
		// case Token.dot: I think this was incorrect. :.C??
		// chain = '\0';
		// break;
		case Token.integer:
			tokenChain = tokenNext();
			if (tokenChain.intValue < 0 || tokenChain.intValue > 9)
				return invalidChainSpecification();
			chain = (char) ('0' + tokenChain.intValue);
			break;
		case Token.identifier:
			tokenChain = tokenNext();
			String strChain = (String) tokenChain.value;
			if (strChain.length() != 1)
				return invalidChainSpecification();
			chain = strChain.charAt(0);
			if (chain == '?')
				return true;
			break;
		default:
			return invalidChainSpecification();
		}
		return generateResidueSpecCode(new Token(Token.spec_chain, chain, "spec_chain"));
	}